一.Android反射工具类
package xx.com;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class RefInvoke {
/** 根据全类名反射无参构造函数
* 调用方式 Object obj = RefInvoke.createObject(className);
* @param className 全类名
* @return
*/
public static Object createObject(String className) {
Class[] pareTyples = new Class[]{};
Object[] pareVaules = new Object[]{};
try {
Class r = Class.forName(className);
return createObject(r, pareTyples, pareVaules);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/** 根据类反射无参构造函数
* 调用方式 Object obj = RefInvoke.createObject(className);
* @param clazz 类
* @return
*/
public static Object createObject(Class clazz) {
Class[] pareTyple = new Class[]{};
Object[] pareVaules = new Object[]{};
return createObject(clazz, pareTyple, pareVaules);
}
/**根据全类名(String)反射只有一个参数的构造函数
* @param className 类名
* @param pareTyple 参数类型
* @param pareVaule 参数值
* @return
*/
public static Object createObject(String className, Class pareTyple, Object pareVaule) {
Class[] pareTyples = new Class[]{ pareTyple };
Object[] pareVaules = new Object[]{ pareVaule };
try {
Class r = Class.forName(className);
return createObject(r, pareTyples, pareVaules);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**根据类(Class)反射只有一个参数的构造函数
* @param clazz 类
* @param pareTyple 参数类型
* @param pareVaule 参数值
* @return
*/
public static Object createObject(Class clazz, Class pareTyple, Object pareVaule) {
Class[] pareTyples = new Class[]{ pareTyple };
Object[] pareVaules = new Object[]{ pareVaule };
return createObject(clazz, pareTyples, pareVaules);
}
/**根据全类名(String)反射有多个参数的构造函数
* @param className 类名
* @param pareTyples 参数类型数组
* @param pareVaules 参数值数组
* @return
*/
public static Object createObject(String className, Class[] pareTyples, Object[] pareVaules) {
try {
Class r = Class.forName(className);
return createObject(r, pareTyples, pareVaules);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**根据类(Class)反射有多个参数的构造函数
* @param clazz 类
* @param pareTyples 参数类型数组
* @param pareVaules 参数值数组
* @return
*/
public static Object createObject(Class clazz, Class[] pareTyples, Object[] pareVaules) {
try {
Constructor ctor = clazz.getDeclaredConstructor(pareTyples);
ctor.setAccessible(true);
return ctor.newInstance(pareVaules);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 调用实例方法,多个参数
* @param obj 根据类名获取的构造函数对象
* @param methodName 方法名
* @param pareTyples 参数类型
* @param pareVaules 参数值
* @return
*/
public static Object invokeInstanceMethod(Object obj, String methodName, Class[] pareTyples, Object[] pareVaules) {
if (obj == null)
return null;
try {
//调用一个private方法
Method method = obj.getClass().getDeclaredMethod(methodName, pareTyples); //在指定类中获取指定的方法
method.setAccessible(true);
return method.invoke(obj, pareVaules);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 调用实例方法,一个参数
* @param obj 根据类名获取的构造函数对象
* @param methodName 方法名
* @param pareTyple 参数类型
* @param pareVaule 参数值
* @return
*/
public static Object invokeInstanceMethod(Object obj, String methodName, Class pareTyple, Object pareVaule) {
Class[] pareTyples = {pareTyple};
Object[] pareVaules = {pareVaule};
return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
}
/**
* 调用实例方法,无参
* @param obj 根据类名获取的构造函数对象
* @param methodName 方法名
* @return
*/
public static Object invokeInstanceMethod(Object obj, String methodName) {
Class[] pareTyples = new Class[]{};
Object[] pareVaules = new Object[]{};
return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
}
/**调用静态方法,无参
* @param className 类名(String)
* @param method_name 方法名
* @return
*/
public static Object invokeStaticMethod(String className, String method_name) {
Class[] pareTyples = new Class[]{};
Object[] pareVaules = new Object[]{};
return invokeStaticMethod(className, method_name, pareTyples, pareVaules);
}
/**调用静态方法,一个参数
* @param className 类名(String)
* @param method_name 方法名
* @param pareTyple 参数类型
* @param pareVaule 参数值
* @return
*/
public static Object invokeStaticMethod(String className, String method_name, Class pareTyple, Object pareVaule) {
Class[] pareTyples = new Class[]{pareTyple};
Object[] pareVaules = new Object[]{pareVaule};
return invokeStaticMethod(className, method_name, pareTyples, pareVaules);
}
/**用静态方法,多个参数
* @param className 类名(String)
* @param method_name 方法名
* @param pareTyples 参数类型[]
* @param pareVaules 参数值[]
* @return
*/
public static Object invokeStaticMethod(String className, String method_name, Class[] pareTyples, Object[] pareVaules) {
try {
Class obj_class = Class.forName(className);
return invokeStaticMethod(obj_class, method_name, pareTyples, pareVaules);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**调用静态方法,无参(Class)
* @param clazz 类
* @param method_name 方法名
* @return
*/
public static Object invokeStaticMethod(Class clazz, String method_name) {
Class[] pareTyples = new Class[]{};
Object[] pareVaules = new Object[]{};
return invokeStaticMethod(clazz, method_name, pareTyples, pareVaules);
}
/**调用静态方法,一个参数(Class)
* @param clazz 类
* @param method_name 方法名
* @param classType 参数类型
* @param pareVaule 参数值
* @return
*/
public static Object invokeStaticMethod(Class clazz, String method_name, Class classType, Object pareVaule) {
Class[] classTypes = new Class[]{classType};
Object[] pareVaules = new Object[]{pareVaule};
return invokeStaticMethod(clazz, method_name, classTypes, pareVaules);
}
/**调用静态方法,多个参数(Class)
* @param clazz 类
* @param method_name 方法名
* @param pareTyples 参数类型[]
* @param pareVaules 参数值[]
* @return
*/
public static Object invokeStaticMethod(Class clazz, String method_name, Class[] pareTyples, Object[] pareVaules) {
try {
Method method = clazz.getDeclaredMethod(method_name, pareTyples);
method.setAccessible(true);
return method.invoke(null, pareVaules);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取实例字段,简写版本
* @param obj 根据类名获取的构造函数对象
* @param filedName 字段名
* @return
*/
public static Object getFieldObject(Object obj, String filedName) {
return getFieldObject(obj.getClass(), obj, filedName);
}
/**获取实例字段
* @param className 类名
* @param obj 根据类名获取的构造函数对象
* @param filedName 字段名
* @return
*/
public static Object getFieldObject(String className, Object obj, String filedName) {
try {
Class obj_class = Class.forName(className);
return getFieldObject(obj_class, obj, filedName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**获取实例字段
* @param clazz 类
* @param obj 根据类名获取的构造函数对象
* @param filedName 字段名
* @return
*/
public static Object getFieldObject(Class clazz, Object obj, String filedName) {
try {
Field field = clazz.getDeclaredField(filedName);
field.setAccessible(true);
return field.get(obj);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**设置实例字段,简写版本
* @param obj 根据类名获取的构造函数对象
* @param filedName 字段名
* @param filedVaule 字段值
*/
public static void setFieldObject(Object obj, String filedName, Object filedVaule) {
setFieldObject(obj.getClass(), obj, filedName, filedVaule);
}
/**设置实例字段
* @param clazz 类
* @param obj 根据类名获取的构造函数对象
* @param filedName 字段名
* @param filedVaule 字段值
*/
public static void setFieldObject(Class clazz, Object obj, String filedName, Object filedVaule) {
try {
Field field = clazz.getDeclaredField(filedName);
field.setAccessible(true);
field.set(obj, filedVaule);
} catch (Exception e) {
e.printStackTrace();
}
}
/**设置实例字段
* @param className 类名(String)
* @param obj 根据类名获取的构造函数对象
* @param filedName 字段名
* @param filedVaule 字段值
*/
public static void setFieldObject(String className, Object obj, String filedName, Object filedVaule) {
try {
Class obj_class = Class.forName(className);
setFieldObject(obj_class, obj, filedName, filedVaule);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取静态实例字段
* @param className 类名(String)
* @param filedName 字段名
* @return
*/
public static Object getStaticFieldObject(String className, String filedName) {
return getFieldObject(className, null, filedName);
}
/**获取静态实例字段
* @param clazz 类(Class)
* @param filedName 字段名
* @return
*/
public static Object getStaticFieldObject(Class clazz, String filedName) {
return getFieldObject(clazz, null, filedName);
}
/**设置静态实例字段
* @param classname 类名
* @param filedName 字段名
* @param filedVaule 字段值
*/
public static void setStaticFieldObject(String classname, String filedName, Object filedVaule) {
setFieldObject(classname, null, filedName, filedVaule);
}
/**设置静态实例字段
* @param clazz 类
* @param filedName 字段名
* @param filedVaule 字段值
*/
public static void setStaticFieldObject(Class clazz, String filedName, Object filedVaule) {
setFieldObject(clazz, null, filedName, filedVaule);
}
}
二、调用示例
//1.获取类的private实例方法,并调用
final String className = "android.app.Activity";
public void test1() {
try {
//创建一个对象
Class[] p3 = {int.class, String.class};
Object[] v3 = {1, "123"};
Object obj = RefInvoke.createObject(className, p3, v3);
//一个参数
Object result = RefInvoke.invokeInstanceMethod(obj, "doSOmething", String.class, "123");
//无参数
Object result2 = RefInvoke.invokeInstanceMethod(obj, "doSOmething2");
//多个参数
Class[] p4 = {String.class, int.class};
Object[] v4 = {"bjq", 1};
Object result3 = RefInvoke.invokeInstanceMethod(obj, "doSOmething3", p4, v4);
} catch (Exception e) {
e.printStackTrace();
}
}
//2.获取类的private实例字段,并修改
public void test2() {
try {
//创建一个对象
Class[] p3 = {int.class, String.class};
Object[] v3 = {1, "bjq"};
Object obj = RefInvoke.createObject(className, p3, v3);
//获取name字段,private
Object fieldObject = RefInvoke.getFieldObject(obj, "name");
Object fieldObject3 = RefInvoke.getFieldObject(className, obj, "name");
// 设置name字段
// 只对obj有效
RefInvoke.setFieldObject(obj, "name", "123456");
RefInvoke.setFieldObject(className, obj, "name", "123456");
} catch (Exception e) {
e.printStackTrace();
}
}
//3.获取类的private静态字段,并修改
public void test3() {
try {
Object fieldObject = RefInvoke.getFieldObject(className, "address");
RefInvoke.setStaticFieldObject(className, "address", "ABCD");
//静态变量,一次修改,终生受用
TestClassCtor.printAddress();
} catch (Exception e) {
e.printStackTrace();
}
}