------- android培训、java培训、期待与您交流! ----------
反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容。而且将字节
码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员。简单说:反射技术可以对一个类进行解剖。 反射的好处:大大的增强了程序的扩展性。
反射的基本步骤:
1、获得Class对象,就是获取到指定的名称的字节码文件对象。
2、实例化对象,获得类的属性、方法或构造函数。
3、访问属性、调用方法、调用构造函数创建对象。 获取这个Class对象,
有三种方式:
1:通过每个对象都具备的方法getClass来获取。弊端:必须要创建该类对象,才可以调用getClass方法。
2:每一个数据类型(基本数据类型和引用数据类型)都有一个静态的属性class。弊端:必须要先明确该类。
前两种方式不利于程序的扩展,因为都需要在程序使用具体的类来完成。
3:使用的Class类中的方法,静态的forName方法。
实用方法:
调用 类名.Class,可以获取该类的字节码
Class cls1=Data.class;
public static void main(String[] args) {
String str1="abc";
//获取str1字节码
Class cls1=str1.getClass();
System.out.println(cls1);
}
Field类 代表某个类中的一个成员变量
class Reflecpoint{
private int x;
public int y;
//构造函数
public Reflecpoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
//反射类
public class Method {
public static void main(String[] args) throws Exception{
Reflecpoint pt1=new Reflecpoint(3, 9);
//得到类的成员变量,先要得到该类的字节码
//fieldY(共有的)不是对象身上的变量,而是类上,要用它去取某个对象上对应的值
Field fieldY=pt1.getClass().getField("y");
System.out.println(fieldY.get(pt1));
//获取fieldX(私有的) getDeclaredField获取该类中任意成员变量,包括私有
Field fieldX=pt1.getClass().getDeclaredField("x");
//将该私有字段进行取消权限检查的能力
fieldX.setAccessible(true);
System.out.println(fieldY.get(pt1));
}
}
Method类 代表某个类中的成员方法
String str1="abc";
Method methodChar=String.class.getMethod("charAt", int.class);
//invoke()调用方法
System.out.println(methodChar.invoke(str1, 1));