java反射代理学习

    xiaoxiao2021-03-25  180

    package com.pinganfu.openapi.service; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; public class ReflectTest { static class Type { public int pubIntField; public String pubStringField; private int prvIntField; public Type() { Log("Default Constructor"); } Type(int arg1, String arg2) { pubIntField = arg1; pubStringField = arg2; Log("Constructor with parameters"); } public int getPrvIntField() { return prvIntField; } public void setPrvIntField(int prvIntField) { this.prvIntField = prvIntField; } private void Log(String msg) { System.out.println("Type:" + msg); } } static class ExtendType extends Type { public int pubIntExtendField; public String pubStringExtendField; private int prvIntExtendField; public ExtendType() { Log("Default Constructor"); } ExtendType(int arg1, String arg2) { pubIntExtendField = arg1; pubStringExtendField = arg2; Log("Constructor with parameters"); } public void setIntExtendField(int field7) { this.prvIntExtendField = field7; } public int getIntExtendField() { return prvIntExtendField; } private void Log(String msg) { System.out.println("ExtendType:" + msg); } } public static void testClassInstance() { Boolean foo = true; Class<?> obj1 = foo.getClass(); Class<?> obj2 = Boolean.class; Class<?> obj3 = Boolean.TYPE; try { Class<?> obj4 = Class.forName("java.lang.Boolean"); System.out.println(obj4); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(obj1); System.out.println(obj2); System.out.println(obj3); } public static void testGetFields() { /* * 可见getFields和getDeclaredFields区别: getFields返回的是申明为public的属性,包括父类中定义, * getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。 */ Class<?> classType = ReflectTest.ExtendType.class; System.out.println(classType); // 使用getFields获取属性 Field[] fields = classType.getFields(); for (Field f : fields) { System.out.println(f); } System.out.println("+++++"); // 使用getDeclaredFields获取属性 fields = classType.getDeclaredFields(); for (Field f : fields) { System.out.println(f); } } public static void testGetMethods() { Class<?> classType = ExtendType.class; Method[] methods = classType.getMethods(); for (Method m : methods) { System.out.println(m); } System.out.println("======"); methods = classType.getDeclaredMethods(); for (Method m : methods) { System.out.println(m); } } public static void testGetConstructos() { // 使用getConstructors获取构造器 Class<?> classType = ExtendType.class; Constructor<?>[] constructors = classType.getConstructors(); for (Constructor<?> m : constructors) { System.out.println(m); } System.out.println(); // 使用getDeclaredConstructors获取构造器 constructors = classType.getDeclaredConstructors(); for (Constructor<?> m : constructors) { System.out.println(m); } } public static void testNewInstance() { Class<?> classType = ExtendType.class; Object inst1 = null; Object inst2 = null; Object inst3 = null; try { inst1 = classType.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } Constructor<?> constructor1 = null; Constructor<?> constructor2 = null; try { constructor1 = classType.getConstructor(); constructor2 = classType.getDeclaredConstructor(int.class, String.class); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { inst2 = constructor1.newInstance(); inst3 = constructor2.newInstance(1, "123"); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(inst1); System.out.println(inst2); System.out.println(inst3); } public static void testInvokeMethods() { Class<?> classType = ExtendType.class; Object inst = null; try { inst = classType.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } Method logMethod = null; try { logMethod = classType.getDeclaredMethod("Log", String.class); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { logMethod.setAccessible(true);// 不加这句,报private异常, logMethod.invoke(inst, "test"); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void testGetterAndSetter() { Class<?> classType = ExtendType.class; Object inst = null; try { inst = classType.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } Field intField = null; try { intField = classType.getField("pubIntExtendField"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { intField.setInt(inst, 100); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { int value = intField.getInt(inst); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } testSetter(classType, inst, "prvIntField", 10); System.out.println(testGetter(classType, inst, "prvIntField")); } public static Object testGetter(Class<?> classType, Object obj, String fieldName) { return testAccessField(classType, obj, fieldName, null, false); } public static void testSetter(Class<?> classType, Object obj, String fieldName, Object fieldVal) { testAccessField(classType, obj, fieldName, fieldVal, true); } private static Object testAccessField(Class<?> classType, Object obj, String fieldName, Object fieldVal, boolean flag) { Object fieldObj = null; Method[] methods = classType.getMethods(); Method getMethod = null; Method setMethod = null; for (int i = 0; i < methods.length; i++) { System.out.println(methods[i].getName()); String methodName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if (flag) { if (("set" + methodName).equals(methods[i].getName())) { setMethod = methods[i]; break; } } else { if (("get" + methodName).equals(methods[i].getName())) { getMethod = methods[i]; break; } } } try { if (flag) { if (setMethod != null) { setMethod.setAccessible(true); setMethod.invoke(obj, fieldVal); } else { // field.set(obj, fieldVal); System.err.println("error"); } } else { if (getMethod != null) { getMethod.setAccessible(true); fieldObj = getMethod.invoke(obj); } else { // fieldObj =field.get(obj); System.err.println("error"); } } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return fieldObj; } public static void testGetterAndSetter(Class<?> classType, Object obj, String fieldName, Object fieldVal) { Object fieldObj = null; /* * Field[] fields = classType.getFields(); * * Field field = null; * * for (int i = 0; i < fields.length; i++) { if( fieldName == * fields[i].getName()){ field = fields[i]; break; } } * * if(field == null){ return ;} */ Method[] methods = classType.getMethods(); Method getMethod = null; Method setMethod = null; for (int i = 0; i < methods.length; i++) { System.out.println(methods[i].getName()); String methodName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); if (("get" + methodName).equals(methods[i].getName())) { getMethod = methods[i]; continue; } if (("set" + methodName).equals(methods[i].getName())) { setMethod = methods[i]; continue; } if (getMethod != null && setMethod != null) break; } try { if (setMethod != null) { setMethod.setAccessible(true); setMethod.invoke(obj, fieldVal); } else { // field.set(obj, fieldVal); System.err.println("error"); } if (getMethod != null) { setMethod.setAccessible(true); fieldObj = getMethod.invoke(obj); } else { // fieldObj =field.get(obj); System.err.println("error"); } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(fieldObj); } static interface Face { public void say(); public int count(); } static class RealTeller implements Face { @Override public void say() { System.out.println("hello"); } @Override public int count() { // TODO Auto-generated method stub return 100; } } static class CommonHandler implements InvocationHandler { private Object target; public CommonHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub // System.out.println("proxy--"+proxy); // System.out.println("target--"+target); // System.out.println("Method:"+ method + ",Args:" + args); return method.invoke(target, args); } } public static Object testProxy(Object target) { // Face target = new RealTeller(); Object proxy = (Face) Proxy.newProxyInstance(ReflectTest.class.getClassLoader(), target.getClass().getInterfaces(), new CommonHandler(target)); return proxy; } public static void main(String[] args) { // testClassInstance(); // testGetFields(); // testGetMethods(); // testGetConstructos(); // testNewInstance(); // testInvokeMethods(); // testGetterAndSetter(); Face face = (Face) testProxy(new RealTeller()); System.out.println(face.getClass()); face.say(); System.out.println(face.count()); } }
    转载请注明原文地址: https://ju.6miu.com/read-2333.html

    最新回复(0)