更新1:
1.System.err: java.lang.InstantiationException: java.lang.Class<android.hardware.input.InputManager> has no zero argument constructor
2.数组传参:Method method = clazz.getDeclaredMethod("setPointerPosition",new Class[]{float[].class});//数组传参
try {
InputManager inputManager = (InputManager) getSystemService(Context.INPUT_SERVICE);//先获取对象
// Class clazz = Class.forName("android.hardware.input.InputManager");
Class clazz = inputManager.getClass();//拿到class类
Method[] methods = clazz.getDeclaredMethods();
// for (Method method1:methods){
// log.d("InputManager=====================" + method1);
// }
//无法通过newInstance构建对象,构造函数带参且私有
/* private InputManager(IInputManager im) {
mIm = im;
}*/
//Object object = clazz.newInstance();//System.err: java.lang.InstantiationException: java.lang.Class<android.hardware.input.InputManager> has no zero argument constructor
Method method = clazz.getDeclaredMethod("setPointerPosition",new Class[]{float[].class});//数组传参
log.d("InputManager==" + method);
method.invoke(inputManager,new float[]{700,600});
} catch ( NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
1.获取类的成员变量:
a)Class.getDeclaredField(String name);
返回一个
Field
对象,该对象反映此 Class
对象所表示的类或接口的指定已声明字段。
b)Class.getDeclaredFields();
返回
Field
对象的一个数组,这些对象反映此 Class
对象所表示的类或接口所声明的所有字段。
c)
Class.getField(String name)
;
返回一个
Field
对象,它反映此 Class
对象所表示的类或接口的指定公共成员字段。
d)
;Class.getFields()
返回一个包含某些 Field
对象的数组,这些对象反映此 Class
对象所表示的类或接口的所有可访问公共字段。
示例1:
public static int getPppoeType() {
int result = 14;
Class<ConnectivityManager> cls = ConnectivityManager.class;
Field[] fields = cls.getFields();
for (Field f : fields) {
if (f.getName().equals("TYPE_PPPOE")) {
try {
result = f.getInt(cls);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
return result;
}
2.获取类反射方法:a)首先通过反射获取类的类型:
// 第一种方式:通过Class静态方法forName(返回与带有给定字符串名的类或接口相关联的 Class 对象)
try {
Class ClasscType1 = Class.forName("com.sunniwell.UserInfo");//必须加上包名,否则报错
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 第二种方式:java中每个类型都有class属性
Class ClasscType2 = UserInfo.class;
// 第三种方式:java语言中任何一个java对象都有getClass 方法
UserInfo userInfo = new UserInfo();
Class ClasscType3 = userInfo.getClass(); // ClasscType3是运行时类
b)其次通过newInstance创建类对象新实例:此方法要求对应类必须有无参的构造方法,否则无法创建。
// 第二种方式:java中每个类型都有class属性
Class ClasscType2 = UserInfo.class;
try {
Object object=ClasscType2.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
3.执行方射方法:
a)结构:方法.invoke(类实例,参数); b)method.setAccessible(true);作用打破封装,获取权限用;
Class<? extends Class> vClass = herosClass.getClass();
try {
Method method1 = herosClass.getMethod("setName", String.class);
Method method2 = herosClass.getMethod("getName");
Object userInfo = herosClass.newInstance();// 创建新实例
method1.setAccessible(true);
method1.invoke(userInfo, "hello");
System.out.println("调用set方法:" + userInfo);
System.out.println("调用get方法:" + method2.invoke(userInfo));
} catch (Exception e) {
e.printStackTrace();
}