对反射的封装
--摘自《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) {}@Overridepublic 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 baobaoNo2:
實例方法
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 123jianqiangNo3:
調用靜態方法
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,workNo4:
設置字段的值
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反射,就能夠封裝出來
歡迎關注我的微信公眾號:安卓圈
轉載于:https://www.cnblogs.com/anni-qianqian/p/10088185.html
總結