反射

来源:互联网 发布:淘宝房产司法拍卖入口 编辑:程序博客网 时间:2024/06/13 05:05

 ---------------------- android培训、java培训、期待与您交流! ----------------------

 

 

一、        反射的定义

  反射就是把java类中的各种成分映射成相应的java类。例如:一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,他们是Field、Method、Contructor 、Package等等。

  如何得到各个字节码对应的实例对象(Class类型)

以如下例子说明:Person p1=new Person();

Class cls1= Person.class//字节码1;

得到字节码的方法:(3种)

①类名.class . 例如:Person.class

②类对象名.getClass().例如:p1.getClass();

③Class.forname(“类名”).例如 Class. Forname (“java.lang.String”)

说明:Class.forname用于返回类的字节码,有2种情况

——类的字节码已加载到虚拟机中,直接找到字节码把它返回

——虚拟机中没有这个字节码,用类加载器把字节码加载进来,然后把字节码缓存在虚拟机中,同时方法返回加载进来的字节码

注意:做反射时一般用第3种

 

二、        Constructor类

(1)   Constructor类代表某个类中的一个构造方法

                         i.            得到某个类所有的构造方法

——Constructor [ ] constructors = Class . forName (“java.lang.String”) . getConstructors;

                       ii.            得到某一个构造方法 

——Constructor constructor = Class . forName (“java.lang.String”) . getConstructor(StringBuffer.class);//括号中为获得方法时要用到的类型

(2)   创建实例对象

——通常方法:String str=new String(new StringBuffer(“abc”));

——反射方法:String str=(String)constructor.newInstance(new StringBuffer(“abc”));//调用获得的方法时要用到上面相同类型的实例对象

  (3)Class.newInstance()方法:

——String obj = (String) Class . forName (“java.lang.String”.newInstance();

——该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。

——该方法内部的具体实现代码用到了缓存机制来保存默认构造方法的实例对象。

 

三、            Field类

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

2、 得到的Field对象是对应到类上面的成员变量,而不是对应到对象上的成员变量。 如需要获得某个对象的值,需要调用get方法。格式为:new Field().get(对象名)。

四、            Method类

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

2、  得到类中的某一个方法:

   格式 Method 对象名=Class.forName(“类名”).getMethod(“方法名”,参数列表)

例子:Method charAt=

Class.forName(“java.lang.String”).getMethod(“charAt”,int class);

3、  调用方法

——通常方法:System.out.println(str.charAt(1));

——反射方法:System.out.println(CharAt.invoke(str,1));         

  如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法。invoke是Method对象上的一个方法。

4、  jdk1.4和jdk1.5的invoke方法的区别

    ——jdk1.5:public Object invoke(Object obj,Object …args)

 ——jdk1.4:public Object invoke(Object obj,Object [] args),

即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码页可以用jdk1.4改写为CharAt.invoke(str,new Object[]{1})形式

 

 

 

 

---------------------- android培训、java培训、期待与您交流! ----------------------