JAVA反射 总结

    在JAVA中,一切都是对象,那么你新建的一个class也是对象吗?

    是的,新建的class也是对象,它是java.lang.Class的实例对象。

      class A{}

      A a = new A();

    1,  Class c1 = a.class;  // c1表示A这个类的类类型(小a是A的实例对象)   ,这也说明了每一个类都有一个静态成员class;

    2,    Class c2 = a.getClass();  // c2表示A这个类的类类型  ,通过该A类的对象a的getClass()方法获取。

              c1 == c2    //它们都是A类的类类型,一个类只可能是Class类的一个实例对象。

    3,  Class c3 = null;

         c3 = Class.forName("com.wjb.A");    //括号里写的是全类名

              c2 == c3 

        所以,完全可以通过类类型(c1 , c2 , c3)创建A的实例对象;

              A a = (A)c1.newInstance();     // 注意A类一定要有无参的构造方法

=============================================================

            编译时加载的类是:静态加载类

            运行时加载的类是:动态加载类

 

知道了类类型后,可以通过c1.获取类的一些信息,方法的一些信息,成员变量的一些信息。

=============================================================

集合的泛型也是一种反射,但是只在编译时有效,运行时就没有泛型了。

  /*Class,method,field(类,方法,成员变量)的操作都是绕过编译的一些操作。*/

package javaReflect;

import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * Created by wjb on 2017/3/6.
 */
public class Demo {
    public static void main(String[] args) {
        String s = "Hello";
        ClassUtis.printMessage(s);

        ArrayList list1 = new ArrayList();

        ArrayList<String> list2 = new ArrayList<String>();
        list2.add("hello");

        Class c = list2.getClass();
        try {
            Method method = c.getMethod("add", Object.class);
            method.invoke(list2,20);  // 调用方法,绕过编译就绕过泛型了。
            System.out.println(list2.size());
            System.out.println(list2);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}

list2的泛型是String类型,按道理是不能加入20的,但是绕过了编译,可以加进去。说明泛型只在编译时有效。

 

 

      

 

posted on 2017-03-08 16:17  三碗才能饱  阅读(124)  评论(0编辑  收藏  举报

导航