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 }