对反射的封装
--摘自《android插件化开发指南》
前面是基本封装,后面是进一步的封装
一。基本封装
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class RefInvoke {
//构造函数
public static Object createObject(String className, Class[] pareTyples, Object[] pareVaules) {
try {
Class r = Class.forName(className);
Constructor ctor = r.getDeclaredConstructor(pareTyples);
ctor.setAccessible(true);
return ctor.newInstance(pareVaules);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//调用实例方法
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;
}
//调用静态方法
public static Object invokeStaticMethod(String className, String method_name, Class[] pareTyples, Object[] pareVaules) {
try {
Class obj_class = Class.forName(className);
Method method = obj_class.getDeclaredMethod(method_name, pareTyples);
method.setAccessible(true);
return method.invoke(null, pareVaules);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//获取字段值
public static Object getFieldObject(String className, Object obj, String filedName) {
try {
Class obj_class = Class.forName(className);
Field field = obj_class.getDeclaredField(filedName);
field.setAccessible(true);
return field.get(obj);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//设置字段值
public static void setFieldObject(String classname, Object obj, String filedName, Object filedVaule) {
try {
Class obj_class = Class.forName(classname);
Field field = obj_class.getDeclaredField(filedName);
field.setAccessible(true);
field.set(obj, filedVaule);
} catch (Exception e) {
e.printStackTrace();
}
}
}
No1:
构造函数
public class TestClassCtor {
private String name;
public TestClassCtor() {
name = "baobao";
}
public TestClassCtor(int a) {
}
public TestClassCtor(int a, String b) {
name = b;
}
private TestClassCtor(int a, double c) {
}
@Override
public String toString() {
return name;
}
}
try {
String className = "com.example.reflectiontest.TestClassCtor";
Class r = Class.forName(className);
//含参
Class[] p3 = {int.class, String.class};
Object[] v3 = {1, "bjq"};
Object obj = RefInvoke.createObject(className, p3, v3);
System.out.println(obj.toString());
//无参
Object obj2 = RefInvoke.createObject(className, null, null);
System.out.println(obj2.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
-------------------
bjq
baobao
No2:
实例方法
public class TestClassCtor {
private String name;
public TestClassCtor() {
name = "baobao";
}
public TestClassCtor(int a) {
}
public TestClassCtor(int a, String b) {
name = b;
}
private TestClassCtor(int a, double c) {
}
private String doSomething(String d) {
System.out.println("TestClassCtor,doSomething");
return "123" + d;
}
}
try {
String className = "com.example.reflectiontest.TestClassCtor";
Class r = Class.forName(className);
Class[] p3 = {int.class, String.class};
Object[] v3 = {1, "bjq"};
Object obj = RefInvoke.createObject(className, p3, v3);
//含参
Class[] p4 = {String.class};
Object[] v4 = {"jianqiang"};
Object result = RefInvoke.invokeInstanceMethod(obj, "doSomething", p4, v4);
System.out.println(result.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
-------------------------
TestClassCtor,doSomething
123jianqiang
No3:
调用静态方法
public class TestClassCtor {
private String name;
public TestClassCtor() {
name = "baobao";
}
public TestClassCtor(int a) {
}
public TestClassCtor(int a, String b) {
name = b;
}
private TestClassCtor(int a, double c) {
}
private static void work() {
System.out.println("TestClassCtor,work");
}
}
try {
String className = "com.example.reflectiontest.TestClassCtor";
Class r = Class.forName(className);
//含参
Class[] p5 = {};
Object[] v5 = {};
RefInvoke.invokeStaticMethod(className, "work", p5, v5);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
-----------------------
TestClassCtor,work
No4:
设置字段的值
public class TestClassCtor {
private String name;
private static String address;
public TestClassCtor() {
name = "baobao";
}
public TestClassCtor(int a) {
}
public TestClassCtor(int a, String b) {
name = b;
}
private TestClassCtor(int a, double c) {
}
}
try {
String className = "com.example.reflectiontest.TestClassCtor";
Class r = Class.forName(className);
Class[] p3 = {int.class, String.class};
Object[] v3 = {1, "bjq"};
Object obj = RefInvoke.createObject(className, p3, v3);
RefInvoke.setFieldObject(className, obj, "name", "jianqiang1982");
Object fieldObject = RefInvoke.getFieldObject(className, obj, "name");
System.out.println(fieldObject.toString());
RefInvoke.setFieldObject(className, null, "address", "ABCD");
Object fieldObject2 = RefInvoke.getFieldObject(className, null, "address");
System.out.println(fieldObject2.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
---------------------
jianqiang1982
ABCD
二。进一步封装
其实就是重构了一下
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class RefInvoke {
//无参
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;
}
//无参
public static Object createObject(Class clazz) {
Class[] pareTyple = new Class[]{};
Object[] pareVaules = new Object[]{};
return createObject(clazz, pareTyple, pareVaules);
}
//一个参数
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;
}
//一个参数
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);
}
//多个参数
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;
}
//多个参数
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;
}
//多个参数
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;
}
//一个参数
public static Object invokeInstanceMethod(Object obj, String methodName, Class pareTyple, Object pareVaule) {
Class[] pareTyples = {pareTyple};
Object[] pareVaules = {pareVaule};
return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
}
//无参
public static Object invokeInstanceMethod(Object obj, String methodName) {
Class[] pareTyples = new Class[]{};
Object[] pareVaules = new Object[]{};
return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
}
//无参
public static Object invokeStaticMethod(String className, String method_name) {
Class[] pareTyples = new Class[]{};
Object[] pareVaules = new Object[]{};
return invokeStaticMethod(className, method_name, pareTyples, pareVaules);
}
//一个参数
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);
}
//多个参数
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;
}
//无参
public static Object invokeStaticMethod(Class clazz, String method_name) {
Class[] pareTyples = new Class[]{};
Object[] pareVaules = new Object[]{};
return invokeStaticMethod(clazz, method_name, pareTyples, pareVaules);
}
//一个参数
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);
}
//多个参数
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;
}
//简写版本
public static Object getFieldObject(Object obj, String filedName) {
return getFieldObject(obj.getClass(), obj, filedName);
}
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;
}
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;
}
//简写版本
public static void setFieldObject(Object obj, String filedName, Object filedVaule) {
setFieldObject(obj.getClass(), obj, filedName, 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();
}
}
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();
}
}
public static Object getStaticFieldObject(String className, String filedName) {
return getFieldObject(className, null, filedName);
}
public static Object getStaticFieldObject(Class clazz, String filedName) {
return getFieldObject(clazz, null, filedName);
}
public static void setStaticFieldObject(String classname, String filedName, Object filedVaule) {
setFieldObject(classname, null, filedName, filedVaule);
}
public static void setStaticFieldObject(Class clazz, String filedName, Object filedVaule) {
setFieldObject(clazz, null, filedName, filedVaule);
}
}
只要掌握了基本的java反射,就能够封装出来
欢迎关注我的微信公众号:安卓圈