---------------------- android培训、java培训、期待与您交流! ----------------------
反射就是把Java类中的各种成分映射成相应的java类,在Java中,反射机制起到了放大镜的效果,可以通过类名加载这个类,显示这个类的方法等信息
Constructor类
1.得到某一个类的构造方法
Constructor constructors = Class.forName(''java.lang.String').getconstructor(StringBuffer.class);//获得方法时要用到类型
2.创建实例对象
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到;上面相同类型的实例对象
3.Class.newInstance()方法
例:String obj = (String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该方法创建实例对象。
//new String (new StringBuffer("abc"));
利用反射方式来实现
Constructor constructor1 = String.class.getconstructor(StringBuffer.class);
String str2 = (String)constructor1.newInstance(new StringBuffer("abc");
System.out.println(str2.CharAt(2));
Tips:程序开发分为编译时和运行时,要搞清楚再哪个时期出现了问题。
Field类
Field类代表某个类中的一个成员变量
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
System.out.println(fieldY.get(pt1));
Field fieldX = pt1.getClass().getDeclaredField("x");
fieldX.setAccessible(true);//此处用到了暴力反射
System.out.println(fieldX.get(pt1));
Tips:field.getType ==String.class
此处用== 而不是equals,因为字节码只有一份,所以用==比较
Method类
Method类代表某个类中的一个成员方法
得到类中的某个方法
例:Method CharAt = Class.forName("java.lang.String").getMethod("CharAt",int.class);
调用方法
通常方式 System.out.println(str1.charAt(1));
反射方式 System.out.println(charAt.invoke(str1, 1));
如果传递给Method对象的invoke()方法的一个参数为null,说明该Method对象对应的是一个静态方法。
---------------------- android培训、java培训、期待与您交流! ----------------------