1. 反射无参构造函数
Class clazz =Class.forName("com.test.reflect.Person");
Constructor c =clazz.getConstructor(null);
Person person = (Person)c.newInstance(null);
Class clazz = Class.forName("com.test.reflect.Person");
Person p = (Person)clazz.newInstance();
2. 反射带有参数的构造函数(简单类型)
Class clazz =Class.forName("com.test.reflect.Person");
Constructor c =clazz.getConstructor(String.class);
Person p = (Person) c.newInstance("xxx");
例如:
public static UserHandle newUserHandle(intuserId) {
UserHandle userHandle =null;
try {
Constructor<UserHandle>constructor = UserHandle.class.getConstructor(int.class);
userHandle =(UserHandle) constructor.newInstance(userId);
} catch (Exception e) {
e.printStackTrace();
}
return userHandle;
}
3. 反射带有参数的构造函数(复杂类型)
Class clazz =Class.forName("com.test.reflect.Person");
Constructor c =clazz.getDeclaredConstructor(List.class);
c.setAccessible(true);
Person p = (Person) c.newInstance(new ArrayList());
4. 反射函数(非static函数)
public static voidgrantRuntimePermission(PackageManager pm,
StringpackageName, String permissionName, UserHandle user) {
try{
Methodmethod = PackageManager.class.getMethod("grantRuntimePermission",
String.class,String.class, UserHandle.class);
method.invoke(pm,packageName, permissionName, user);
}catch (Exception e) {
e.printStackTrace();
}
}
5. 反射static函数
// AppOpsManager
public static int permissionToOpCode(Stringpermission) {
try{
Methodmethod = AppOpsManager.class.getMethod("permissionToOpCode",
String.class);
return(Integer) method.invoke(null, permission);
}catch (Exception e) {
e.printStackTrace();
}
return-1;
}
6. 反射成员变量
例如:反射ApplicationInfo下的int类型变量flagsEx(info为ApplicationInfo类型对象)
ApplicationInfo.class.getField("flagsEx").getInt(info)
package org.local;
public class ReflectTest {
/**
* @param args
*/
privateint x;
publicint y;
publicString str1 = "abc";
publicString str2 = "access";
publicReflectTest(int x, int y) {
this.x= x;
this.y= y;
}
@Override
publicString toString() {
return"ReflectTest [str1=" + str1 + ", str2=" + str2 +"]";
}
}
ReflectTest test = new ReflectTest(3,5);
//取得对象字节码
Class cls = test.getClass();
//getField只能得到可见的变量
Field fd1 = cls.getField("y");//返回的值不是test对象的变量,而是Field对象。所以下面必须通过get方法传入指定的ReflectTest对象,获取值
System.out.println("value1:" +fd1.get(test));
//getDeclaredField能够得到私有的变量
Field fd2 = cls.getDeclaredField("x");
fd2.setAccessible(true);
参考:http://blog.csdn.net/howlaa/article/details/8606071