Java动态代理

Java动态代理使用接口进行代理。不直接实例化目标类,而是通过动态代理类生成,这样在这个动态代理中调用目标类的时候就可以在方法前后调用逻辑。

代码如下:

1、创建基本实现类和实现接口:

public interface IHelloWorld {
    public void sayHello();
}
public class HelloWorld implements IHelloWorld{

    @Override
    public void sayHello() {
        System.out.println("Hello World!");
    }

}

2、创建动态代理类:

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

public class HelloWorldProxy<T> implements InvocationHandler{
    T target = null;
    @SuppressWarnings("unchecked")
    public T bind(T target) {
        this.target = target;
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        this.doBefore();
        T result = (T) method.invoke(target, args);
        this.doAfter();
        return result;
    }

    private void doBefore() {
        System.out.println("start...");
        
    }

    private void doAfter() {
        System.out.println("end...");
    }
}


3、测试:

public class HelloWorldTest {
    public static void main(String[] args) {
        HelloWorldProxy<IHelloWorld> proxy = new HelloWorldProxy<IHelloWorld>();
        IHelloWorld helloWorld = proxy.bind(new HelloWorld());
        helloWorld.sayHello();
    }
}
 

4、结果输出: 

start...
Hello World!
end...

5、其他:

Jdk自动动态代理的实现必须代理接口,当需要代理具体实现类时候需要使用Cglib,在Spring AOP中提供JDK动态代理和cglib动态代理的实现。

原文地址:https://www.cnblogs.com/liushijie/p/4712922.html