JDK Proxy動態代理的底層實現
阿新 • • 發佈:2020-09-09
1 /* 2 * JDK動態代理的底層原理:返回實現了介面的匿名內部類。匿名內部類的方法的功能 3 * 是通過InvokeHandler介面實現類的invoke方法實現*/ 4 5 import java.lang.reflect.InvocationHandler; 6 import java.lang.reflect.Method; 7 import java.lang.reflect.Proxy; 8 9 interface Adder{ 10 public Integer add(Integer a, Integer b); 11 } 12 13 class Myproxy{14 public static Adder getNewInstance(ClassLoader classLoader, final Class<?> clazz, InvocationHandler handler){ 15 //返回實現Adder介面的匿名內部類 16 return new Adder() { 17 @Override 18 public Integer add(Integer a, Integer b) { 19 try { 20 21 Method add = clazz.getMethod("add",Integer.class,Integer.class); 22 Object[] args = {a,b}; 23 Object invoke = handler.invoke(this, add, args); 24 return (Integer) invoke; 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } catch (Throwable throwable) {28 throwable.printStackTrace(); 29 } 30 31 return null; 32 } 33 }; 34 } 35 } 36 37 public class JDKProxy_Source { 38 public static void main(String[] args){ 39 40 Adder adder = Myproxy.getNewInstance(Adder.class.getClassLoader(), Adder.class, new InvocationHandler() { 41 @Override 42 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 43 if ("add".equals(method.getName())) { 44 Integer a = (Integer) args[0]; 45 Integer b = (Integer) args[1]; 46 return a + b; 47 } 48 return null; 49 } 50 }); 51 System.out.println(adder.add(1,1)); 52 } 53 }