一.概念:反射就是把java类中的各种成分映射成相应的java类。java类中的成分有Constructor、Field、Method、Package等。
二.成分分析
1.Constructor类(构造方法)
得到某个类所有的构造方法:
Constructor [] constructors = Class.forName("java.lang.String").getConstructors();
得到一个构造方法:
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//通过参数确定要获得哪个构造方法
创建实例对象:
String str = (String)constructor.newInstance(new StringBuffer("abc"));
注意:在反射中,只有Constructor和类字节码(例如:String.class)才能创建实例对象,区别在于类字节码只能通过调用无参构造函数创建。
2.Field类(成员变量)
得到某个类所有的成员变量:
Field [] fields = obj.getClass().getFields();//obj是个对象
得到一个成员变量并调用:
①成员变量是非private
Field fieldX = obj.getClass().getField("x");//obj里面有public成员变量x
fieldX .get(obj);//确定从哪个对象中得到变量值。
②成员变量是private
Field fieldX = obj.getClass().getDeclareField("x");
fieldX.setAccessible(true);//先设置变量对象中的权限
fieldX.get(obj);
3.Method类
得到某个类所有的方法:
Method [] methords = Class.forName("java.lang.String").getMethods();
得到一个方法:
Method methord = Class.forName("java.lang.String").getMethod("charAt",int.class);//charAt是方面名,int.class是该方法的参数类型字节码
注意:如果第一个参数为null,说明Method对象对应的是一个静态方法!
调用方法:
charAt.invoke(str,1);//str是一个String类型对象。
注意:jdk1.4和jdk1.5的invoke方法区别
jdk1.5: public Object invoke (Ojbect obj , Object... args)
jdk1.4: public Object invoke (Ojbect obj , Object[] args)
根据参数兼容性质,1.5即可以接受数组又可以接收可变多参 。为什么参数即可以接收数组又可以接收可变多参呢?这得益于函数体兼容,因为函数体对传进来的数组做了"打散"处理,让它变成了"多参"。如果你的运行环境是jdk1.5,在反射main()方法时为了兼容1.4需要传数组,但考虑到传入时会被打散所以需要在外层额外包装一层数组 ,才能达到最终给传进去一个数组的目的,或者用(object)强转一下,让JVM不认为它是数组,如下:
method.invoke(null,new Object[]{new String[]{"xxx"}});
method.invoke(null,(Object)new String[]{"xxx"});
---------------------- ASP.Net+Android+IO开发S、 .Net培训、期待与您交流! ----------------------