对反射的封装
- 2019 年 10 月 7 日
- 筆記
前面是基本封装,后面是进一步的封装
一。基本封装
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反射,就能够封装出来
–摘自《android插件化开发指南》