------- android培训、java培训、期待与您交流!---------
反射概述:
反射就是把java类中的各种成分映射成相应的java类。 相对于类抽象实例,反射机制抽象的是类、类的方法、类的变量。
一、映射java类
String str1 = "abc";
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
Class type = array.getClass().getComponentType();//获取数组元素的类型
</pre><pre>
二、类的实例化
Class clazz=Class.forName("MyClass");
Object mMyClass=class.getConstructor(arg.class).newInstance(arg.class);//有参数构造函数
Object mMyClass=class.newInstance();//用无参数构造函数初始化
三、函数的获取与调用
Class clazz=String.class;
Object mInstance=clazz.getConstructor(String.class).newInstance("abc");
Method m=clazz.getMethod("charAt",int.class);//获取指定的public方法
Method m=clazz.getDeclareMethod("charAt",int.class);//获取指定私有的方法
Method[] mArray=clazz.getMethods();//获取所有public方法
Method[] mArray=clazz.getDeclareMethods();//获取所有方法
/*-----------------------------方法的调用-------------------------*/
int i=1;
m.setAccessible(true);//私有方法调用前要设置可见性
m.invoke(mInstance,i);//等效于mInstance.charAt(i);
m.invoke(mInstance,(Object)new String[]{"abc","123"});//如果编译器兼用1.4jdk, 对于传递数组要转型为Object.
四、获取与设置字段
Field[] f=clazz.getDeclaredFields();
f[0].setAccessible(true);//设置可读私有字段
f[0].get(mInstance);//读出mInstance的第一个字段的值
f[0].set(mInstance, 'd');//设置mInstance的第一个字段的值
五、内部类
Class clazz=Class.forName("OuterClass");
Class classes[]=clazz.getDeclaredClasses();
for (Class c:classes){ //对成员内部类进行反射
int i=c.getModifiers();
String s=Modifier.toString(i);
if (s.contains( "static" )) //静态内部类的处理
c.getConstructor().newInstance();
else //实例内部类的处理
c.getConstructor(ric.getClass()).newInstance(ric);
}
//由于匿名内部类没有构建器,因此无法创建实例,也无法直接访问其中的方法,但可以通过下面的方式巧秒的执行其中的方法或成员变量。
Runnable r=(Runnable)(clazz.getField("ta" ).get(ric));
r.run();
六、etc
对于String[] Arrays.asList(Object[] obj) 1.4jdk 会返回只含有包含几个元素的List对象
对于int[] Arrays.asList(<T> ....arg) 1.5jdk 会返回只含一个int[]元素的List对象
------- android培训、java培训、期待与您交流!---------