黑马程序员——JAVA高新技术(反射)

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("abc"); 反射方式:Constructor constructor1=String.class.getConstructor(StringBuffer.class);//获取构造方法 String str2=(String)constructor1.newInstance(new StringBuffer("abc"));//用构造方法创建对象

Class.newInstance()方法:

每次都要先获得Constructor对象再去创建所需类的对象太麻烦,可以使用Class.newInstance(),该方法会使用默认的构造方法来创建所需类的对象。

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

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

第二,该方法内部代码,用到了缓存机制来保存默认构造方法的实例对象。

6.Field类(成员变量的反射)

Field类用来描述某个类中的一个成员变量。

成员变量的反射:

//创建一个ReflectPoint类的对象,包含两个成员变量x,y

ReflectPoint pt=newReflectPoint(4, 5);

//成员变量x是public的,可以直接getField得到

Field fieldX=ps.getClass().getField("x");

//fieldX不是对象身上的变量,而是类上的,必须通过get方法把pt1上的x取出

System.out.println(fieldX.get(pt1));

//成员变量y是private的,用getDeclaredField得到(getDeclaredField得到声明过的属性)

Field fieldY=ps.getClass().getDeclaredField("y");

//设置访问权限—暴力反射

fieldY.setAccessible(true);

System.out.println(fieldY.get(pt1));

7.Method类(成员方法的反射)

Method类用来描述某个类中的一个成员方法。

得到类中的某一个方法:

Method charAt=Class.forName("java.lang.String").getMethod("charAt",int.class);

调用方法:

1.通常方式:System.out.println(str.charAt(1));2.反射方式:System.out.println(charAt.invoke(str,1));//str是一个对象,这里str可以是null,说明invoke()方法是一个静态方法

Jdk1.4和jdk1.5的invoke方法的区别:

JDK1.5:public Object invoke(Object obj,Obj…args);

JDK1.4:public Object invoke(Object obj,Object[] args);

8.数组的的反射

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

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

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

4. 注意区别 Array.asList()方法处理int[]和String[]时的差异

5. Array工具类用于完成对数组的反射操作

相信优美的生命,就是一曲无字的挽歌,

黑马程序员——JAVA高新技术(反射)

相关文章:

你感兴趣的文章:

标签云: