• Java泛型和反射总结


    A a = (A)Class.forName(“pacage.A”).newInstance();

    这和你 A a = new A(); 是一样的效果。

    String className = “Example”;
    class c = Class.forName(className);

    1、如果你知道一个实例,那么你可以通过实例的“getClass()”方法获得该对象的类型类;/

    2、如果你知道一个类型,那么你可以使用“.class”的方法获得该类型的类型类。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
                //通过泛型新建对象。Class.forName()和A.class.h
    //            Class<Son> a = Son.class;
    try{
                Class a = Class.forName("com.hao.class14.Son");}catch(Exception e){
    }
                System.out.println("do="+a.getName());
                //创建新的对象。
                Son b= (Son) a.newInstance();需要默认的构造方法,即先调用无参构造方法
    Father b=  a.newInstance();
                if(b instanceof Son){//向下转型
                    Son son = (Son)b;
                }
                b.do1();
                //创建父类对象
                Class<? super Son> c2 = a.getSuperclass();//优于普通的Class
                ((Father)c2.newInstance()).do1();
                //class文件反射查询类的参数。
                Method[] ee = a.getDeclaredMethods();

    出现的时期不同:

    Class.forName()在运行时(类地址为字符串)加载(先找到class中的类):加载类,初始化静态方法。

            使用Class类的中静态forName()方法获得与字符串对应的Class对象

            运行期加载需要加上try。。。catch语句。

    类字面常量Class.class和getClass()是在编译时加载类.不初始化,调用静态或非静态域时初始化。

    1、.class用于类名,getClass()是一个final native的方法,因此用于类实例

    2、.class在编译期间就确定了一个类的java.lang.Class对象;

    3、.getClass()方法在运行期间确定一个类实例的java.lang.Class对象

        调用Object类的getClass()方法来得到Class对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //class文件反射查询类的方法,使用invoke调用。
                Method[] ee = a.getDeclaredMethods();//该方法是获取本类中的所有方法,包括私有的(private、protected、默认以及public)的方法
                Method[] ee1 = a.getMethods();//该方法是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的)
                String [] names ={"tom","tim","allen","alice"};
                try {
                    Method m3 = ee[3];
                    m3.invoke(a.newInstance(),null);
                    Method m1 = a.getMethod("do5",String.class);
                    for(String name:names)
                        m1.invoke(a.newInstance(),name);
                } catch (Exception e) {
                    e.printStackTrace();
                }
     
      Method echoMethod = classType.getMethod("echo",
        new Class[] { String.class });
      result = echoMethod.invoke(invokertester, new Object[] { "hello" });
      System.out.println(result);

    泛型机制:

    这种是jdk1.5引入的泛型机制,没有T这种类型,T是根据你输入的来动态匹配。加入你集合放入的String类型,那么你就可以使用List<String>,然后代码中所有出现T的地方都用String代替就可以了 ,放入的是Object类型,那么你就用List<Object>,

    静态资源不认识泛型。

    泛型三种:
              [1]ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T类型
              [2]ArrayList<?> al=new ArrayList<?>();集合元素可以是任意类型,这种没有意义,一般是方法中,只是为了说明用法
              [3]ArrayList<? extends E> al=new ArrayList<? extends E>();
                泛型的限定:
                   ? extends E:接收E类型或者E的子类型。
                   ?super E:接收E类型或者E的父类型。

     
  • 相关阅读:
    python 类型注解
    python 装饰器
    python 高阶函数、柯里化
    python 生成器函数
    python 递归和匿名函数
    Python 函数返回值、作用域
    Python 练习题总结(待续)
    基于 K8S 集群安装部署 istio-1.2.4
    基于 kubeadm 部署 kubernetes(v1.17.0) 集群
    Gitlab 重置 root 密码
  • 原文地址:https://www.cnblogs.com/shuchen007/p/9427211.html
Copyright © 2020-2023  润新知