反射机制的基石 Class
Class是所有类的类
每个一个类都有相对应的字节码。反射机制依靠字节码。
获得类字节码的方法有三种
例如:
String str1=”abc“;
Class cls1= str1.getClass();
Class cls1= String.class;
Class cls1= Class.forName("java.long.String");
反射
反射就是把Java类中的各种成分映射成相应的JAVA类。例如,一个java类中用一个class类的对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等等信息也用一个个的JAVA类来表示,就像汽车是一个类,汽车中的发动机也是一个类,变速箱也是一个类。
进一步理解,比如说,一个类下面有方法、有构造函数、有成员变量。那么这些都可以理解成一个一个的类。一个成员方法,可以是一个类,他下面有好几个方法,这些方法就是方法对象。
实现举例1
构造函数来体现反射机制
String str1=”abc“;
Constructor constructor1=String.class.getConstructor(StringBuffer.class);
//使用反射机制,创建构造函数的对象,得到String类的某一个构造函数并引用给创建好的构造函数对象。
String str2=(String)constreuctor1.newInstance(new StringBuffer("abc"));
// 通过上面创建好的构造函数对象,生成String类的对象,并引用给str2。括号中的是要建立的对象。不能直接写"abc",因为这是使用构造函数反射创建的对象,编译器需要知道你给哪个类型的创建对象。
实现举例2
关于字段的反射实验
假设有一个类
public abc
{
private int x;
public int y;
public abc(int x,int y){ this.x=x; this.y=y;};
}
通过反射来取这个类中的x y值。
abc a=new abc(3,5);
//创建一个对象,并初始化两个数。x=3,y=5;
Field fieldY=a.getClass().getField("y");
//取得这个类的一个Y值给fieldY。此时fieldy没有具体值,因为这是一个通过一个字节码取得的关于Y的对象,此时只是一个引用的方法,并没有具体指定是什么对象。
fieldY.get(a);
//告诉fieldY这个引用对象,你获得了一个实例对象,是对象a。也可以理解成fieldY本身就是去调用某一个对象的过程,只不过他是在等待系统告诉他需要去取谁的值,这时候你告诉他用a。所以此时的结果是5.
同样,我们去取一个X的值。由于x是私有的。所以这里使用暴力反射。强行拿到x的值。步骤如下:
Field fieldX=a.getClass().getDeclareFieldField("x"); //私有的变量不可见,这时用getDeclareFieldField("x") 告诉系统,私有的我也需要。
fieldX.setAccessible(true); //私有的对象是不能给其他类使用的,这个方法是强行使用私有变量。