1.反射机制就是在java程序运行状态中,对其任何一个类,都能调用其中所有的属性和方法,对于任何一个对象,都能调用其任何一个方法和属性,动态获取其信息,动态调用其方法。获取源程序的字节码的方式有3种:1)类名.class 2)方法名.getClass()
3)Class.forName(“类名”)
9.Integer.TYPE 的基本类型为int,可以用这种方式找出。Integer和int[]都不算基本类型。数组类型实例化对象用的方法是Class.isArray()。总之源程序中出现的类型,都有各自的Class实例对象。
10.反射就是把Java类中的各种成分映射成相应的java类。
11.Consructor类代表某个类的构造方法。例如:
得到某个类的所有构造方法:
Constructor[] constructors =
Class.forName(“java.lang.String”).getConstructors();
得到某一个构造方法:
Constructor[] constructors =
Class.forName(“java.lang.String”).getConstructor(StringBuffer.class,);
12.成员变量的反射机制:获取成员变量反射的值用例如如下代码实现:
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField(“y”); //ReflectPoint中的y字段是public申明,所以用getField,如果是private申明,就要用getDeclareField方法了。但是后者要通过暴力反射机制,追加fieldY.setAccessible(true);使拥有数据 获取权限。
举例说明:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class ReflectTest {
public static void main(String[] args) throws Exception{
String str1 = “abc”;
//三种方式得到Class类,即获得字节码
Class cls1 = str1.getClass();//调用对象的getClass()方法
Class cls2 = String.class; //类名.class方式
Class cls3 = Class.forName(“java.lang.String”);//Class类的forName()方法
//验证得到的是否为同一份字节码,输出结果都为true
System.out.println(cls1 == cls2);
System.out.println(cls1 == cls3);
//判断是否为基本类型的字节码对象
System.out.println(cls1.isPrimitive());
//基本数据类型的的字节码获取只有一种方式,类名.class方式
System.out.println(int.class.isPrimitive());
//数组也是一种特定的类型
System.out.println(int[].class.isPrimitive());//结果为false
System.out.println(int[].class.isArray());//结果为true
//构造方法的反射
//Constructor类代表某个类中的一个构造方法
//得到参数类型为StringBuffer的String的构造方法
Constructor<String> constructor1 = String.class.getConstructor(StringBuffer.class);
//用反射的方式得到new String(new StringBuffer(“abc”))的效果
String str2 = (String)constructor1.newInstance(new StringBuffer(“abc”));
System.out.println(str2.charAt(2));
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField(“y”);//获取字段,fieldY代表一个变量
//fieldY不是对象身上的变量,而是类上的,要用它去取某个对象上对应的值要调用fieldY的get(obj)方法
System.out.println(fieldY.get(pt1));//结果输出为5
//因为ReflectPoint中的x是private修饰的,无法用fieldX.get(pt1)获取,这是需要用getDeclareField(“x”);
Field fieldX = pt1.getClass().getDeclaredField(“x”);
//但是由于是私有的,只允许自己访问,所以还要设置它的访问权限
fieldX.setAccessible(true);//这种方式一般就称为“暴力反射”
System.out.println(fieldX.get(pt1));
changeStringValue(pt1);
System.out.println(pt1.toString());
}
private static void changeStringValue(Object obj) throws Exception{
Field[] fields = obj.getClass().getFields();
for(Field field : fields){
//如果字节码相同,则替换
if(field.getType() == String.class){
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace(‘b’, ‘a’);
//换取之后要,把新字段设置到对象中去
field.set(obj, newValue);//吧newValue设置到obj对象中
}
}
}
}
用到的RelfectPoint类
public class ReflectPoint {
private int x;
public int y;
public String str1 = “ball”;
public String str2 = “ballball”;
public String str3 = “itcase”;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
//复写时@Override,你的方法名写错了的时候编译器会自动报错</span>
@ Override
public String toString(){
return str1+”:”+str2+”:”+str3;
}
}