Java动态代理Proxy

Java动态代理Proxy

规则:

  • 必须实现接口编程;需要一个接口,目标类实现该接口。

  • 必须实现InvocationHandler接口;为目标对象实现增强功能。

例子:

public interface IHelloWorld {
    void print();
}

public class HelloWorldImpl implements IHelloWorld {
    @Override
    public void print() {
        System.out.println("hello world");
    }
}

public class InvocationHandlerDemo implements InvocationHandler {
    private Object target;

    public InvocationHandlerDemo(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("invocationHandler before");
        Object obj = method.invoke(target, args);
        System.out.println("invocationHandler after");
        return obj;
    }
}

public class ProxyApplication {
    public static void main(String[] args) throws Exception {
        // 模式1
        IHelloWorld pd = (IHelloWorld) Proxy.newProxyInstance(IHelloWorld.class.getClassLoader(), new Class[] {IHelloWorld.class}, new InvocationHandlerDemo(new HelloWorldImpl()));
        pd.print();
        System.out.println("-------------------");
        // 模式2
        Class<?> proxyClass = Proxy.getProxyClass(IHelloWorld.class.getClassLoader(), IHelloWorld.class);
        InvocationHandler ih = new InvocationHandlerDemo(new HelloWorldImpl());
        IHelloWorld pd2 = (IHelloWorld) proxyClass.getConstructor(InvocationHandler.class).newInstance(ih);
        pd2.print();
    }
}

// 结果
invocationHandler before
hello world
invocationHandler after
-------------------
invocationHandler before
hello world
invocationHandler after

 

原理:

Proxy根据接口类,创建一个目标对象的代理类。Proxy为代理类通过修改类文件结构,为代理类添加了一个带有InvocationHandler类型的有参构造器,以及为代理类的每个接口方法都添加调用 InvocationHandler.invoke 的指令。最终当调用代理类接口方法时,接口方法里面调用InvocationHandler.invoke,实现代理功能。

posted @ 2022-10-13 09:33  黎明的星海  阅读(116)  评论(0编辑  收藏  举报