黑马程序员_反射

来源:互联网 发布:淘宝怎么增加自然流量 编辑:程序博客网 时间:2024/06/06 23:56

1.Class类

     Person类代表人,它的实例对象就是张三,李四这样一个个具体的人, Java程序中的各个Java类属于同一类事物,描述这类事物

的Java类名就是Class。对比提问:众多的人用一个什么类表示?众多的Java类用一个什么类表示?

     人类Person             Javal类Class
     即Class类代表Java类,它的各个实例对象又分别对应什么呢?
     对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码等。一个类被类加载器加载到
占用一个存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以他们在内存中内容是不同的
这一个个的空间可以分别用一个个对象来表示,这些对象显然具有相同的类型,这个类型是什么呢?
      如何得到各字节码对应的实例对象
     ①类名.class,如:System.class
     ②对象.getClass() 如:new Date().getClass()
     ③Class.forName("类名");如:Class.forName("java.util.Date");

2.反射

     反射就是把Java类中各种成分映射成相应的Java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分

成员变量,方法,构造方法,包等信息也用一个个Java类来表示。

     表示Java类的Class类显然是要提供一系列的方法,来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是

用相应类的实例对象来表示,它们是Field 、Method、Contructor、package等

     一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,

得到这些实例对象后有什么用?怎么用?这正是学习和应用反射的要点。

Constructor类代表某个类中的一个构造方法,

要得到某个类所有的构造方法如下所示:

Constructor [ ]>

得到某一个构造方法:

Constructor>

创建是咧对象:

通用方法:String>

反射方式:String>


Field类代表某个类中的一个成员变量

问题:得到Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而给类的实例对象有多个

,如果是与对象关联,那关联的是哪个对象呢?所以字段field x 代表的是 x 的定义,而不是具体的 x 变量

如: 

       ReflectPoint>

      Field>

      System.out.println(y.get(point));

      Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getDeclaredFiled("x");

      x.setAccessible(true);

     System.out.println(x.get(point));


Method类代表某个类中的一个成员方法

得到类中某一个方法:

Method>

调用方法:通常方法是System.out.println(str.charAt(1));

                    反射方法是System.out.println(charAt.invoke(str,1));

如果传递给Method对象的invoke()方法的第一个参数为null,这样有什么意义呢.?说明个Method对象对应的是一个静态方法。




0 0
原创粉丝点击