-------------------------------------------android培训、期待与您交流 -------------------------------------
反射:把class映射成java类
Constructor构造器
1、 得到所有的构造方法
Constructor[] ctc=Class.forName(“”).contructors();
2、 得到某个构造方法
Constructor ctc=Class.forName().getConstructor(StringBuffer.class)
3、 创建对象
String str=(String)Ctc.newInstance(new StringBuffer(“abc”));
注:class.newInstance()与constructor.newInstance()的区别:前者只能调用无参的构造函数创建实例对象,后者可以调用无参和有参的构造函数创建实例对象
Field:成员函数的反射
//创建测试类 public class ReflectPoint { private int x; public int y; public String str1="ball"; public String str2="basketball"; public String itcast="itcast"; public ReflectPoint(int x, int y) { this.x = x; this.y = y; } } public static void main(String[] args) throws Exception{ ReflectPoint r=new ReflectPoint(3, 5); Field x=r.getClass().getField("y"); // f.setAccessible(true); System.out.println(x.get(r));//field不是类上的值,而是对象上的值,所有要去对象上的值 Field y=r.getClass().getDeclaredField("x");//获取私有的属性 y.setAccessible(true);//获取权限 System.out.println(y.get(r)); Field[] fileds=r.getClass().getFields();//替换字符 for (Field field : fileds) { if(field.getType()==String.class){//字节码比较用== String oldstr=(String)field.get(r); String newstr=oldstr.replaceAll("a", "b"); field.set(r, newstr);//重新设值 } } }
Method:方法的反射
public class ReflectPoint { private int x; public int y; public String str1="ball"; public String str2="basketball"; public String itcast="itcast"; public ReflectPoint(int x, int y) { this.x = x; this.y = y; } public static void staticMethodReflect(){ System.err.println("aaaaa"); } public void methodReflect(String str){ System.err.println(str); } @Override public String toString(){ return x+":"+y; } } //调用methodReflect方法 Method method=r.getClass().getMethod("methodReflect",String.class);//第一个参数是方法的名称,第二个参数是输入形参的class类型 method.invoke(r,"aaaa");//反射的方法是对象上的方法 所以传入对象和实现参数 //静态方法的调用 Method method2=r.getClass().getMethod("staticMethodReflect",String.class); method2.invoke(null,"bbbb");//静态方法的调用
数组的反射
如:
Public static void main(string[] arg){ …….. } Method method2=r.getClass().getMethod("main",String[].class); method2.invoke(null,new object[]{new String[]{"abc","bcd"}});
//jdk为了兼容以前的版本,在反射时,如果方法有数组形参,在调用时,编译器会隐式的把参数打成一个包,所以在调用时要再次进行包装