JDK 动态代理的原理和使用

126 阅读1分钟

jdk的动态代理是通过反射机制生成一个实现代理接口的匿名类,调用具体方法前调用invocationhandler的invoke方法处理.所以使用jdk实现的动态代理的话需要在代理类实现invocationhandler接口,被代理类需要至少实现一个接口。匿名类的实现原理可以查看Proxy类这里不做延伸了。

package com.smartdec;


import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class TestJdkProxyDemo implements InvocationHandler {

    private final JdkProxyServiceImpl jdkProxy;

    public TestJdkProxyDemo(JdkProxyServiceImpl jdkProxy) {
        this.jdkProxy = jdkProxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("befor");
        method.invoke(jdkProxy, args);
        System.out.println("after");
        return args[0];
    }

    public Object getProxy() {
        return Proxy.newProxyInstance(jdkProxy.getClass().getClassLoader(), jdkProxy.getClass().getInterfaces(), this);
    }

    public static void main(String[] args) {
        JdkProxyServiceImpl jdkProxy = new JdkProxyServiceImpl();
        TestJdkProxyDemo demo = new TestJdkProxyDemo(jdkProxy);
        JdkProxyService proxy = (JdkProxyService) demo.getProxy();
        String mm = proxy.writeName("mm");
        System.out.println(mm);
    }
}