黑马程序员—JAVA反射特点

来源:互联网 发布:解可新最优化答案 编辑:程序博客网 时间:2024/06/05 23:45

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

反射就是把java类中的各种成分映射成相应的java类,即Class类。

获得字节码对应的实例对象的三种方法:

1, 类名.class,例如:System.class;

2, 对象.getClass() 例如:new Date().getClass();

3, Class.forName(“类名”) 例如:Class.forName(“java.util.Date”);

注意:基本数据类型和void有对应的Class;用isPrimitive()判断是否是基本数据类型

int.class == Integer.class  // false

Int.class == Interger.TYPE//true

总之:只要在源程序中出现的类型都有各自的Class实例对象,例如:void,int[].

注:一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,得到这些实例对象。怎样用这些实例对象,正是学习和应用反射的重点。

1,Constructor类   

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

1) 得到某个类所有的构造方法:

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

2) 得到某一个构造方法:

    例子:Constructor  constructor = Class.forName(“java.lang.String”). getConstructor(StringBuffer.class);//获得方法时要用到类型

3) 创建实例对象:

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

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

4) Class.newInstance()方法:

例子:String obj = (String)Class.forName(“java.lang.String”).newInstance();

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

该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。

2, Field类 

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

代码示例:

ReflectPoint pt1 = new ReflectPoint(3,5);//自定类,其中成员变量x=3,y=5,x为私有变量

//用反射获取成员变量

Field fieldy = pt1.getClass().getField(“y”);

System.out.println(fieldy.get(pt1));//打印获取到的y的值

//用反射获取私有变量

Field fieldx = pt1.getClass().getDeclareField(“x”);

Fieldx.setAccessible(true);//设置可以访问

System.out.println(fieldx.get(pt1));//打印获取到的x的值

3, Method类

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

1)  得到类中的某一个方法:

例子:Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);

2)  通用方法:

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

反射方式:System.out.println(charAt.invoke(str,1));

注意:如果传递给Method对象的invoke方法的第一个参数是null,说明这是一个静态方法。

3) 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});

4, 数组的反射

1, 具有相同维数和元素的类型的数组属于同一类型,即具有相同的Class实例对象

2, 代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。

3, 基本类型的一维数组可以被当做object类型使用,不能当做Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。

4, Arrays.asList()方法处理int[]和String[]时的差异;

Int[]的地址会被作为一个元素;String[]数组中的每一个元素都会作为List的元素。

原创粉丝点击