Loading

Java实现动态代理

1、实现InvocationHandler接口

这种方式只能针对接口实现类的实例对象。

interface Hello{
    public void sayHello();
}

class HelloImpl implements Hello{
    public void sayHello(){
        System.out.println("Hello");
    }
}

public class Main {
    public static void main(String[] args) {
        Hello hello = (Hello) Proxy.newProxyInstance(
                HelloImpl.class.getClassLoader(),
                HelloImpl.class.getInterfaces(),
                new ProxyInvocationHandler(new HelloImpl()));
        hello.sayHello(); 
    }
}

public class ProxyInvocationHandler implements InvocationHandler{
	private Object obj;
	public ProxyInvocationHandler(Object obj){
		this.obj = obj;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("before");
		Object result=method.invoke(obj,args);
		System.out.println("after");
		return result;
	}
}

表面上操作的对象是接口的对象,但实际在ProxyInvocationHandler中,操作得是Hello接口的实现类的对象。

2、CGLIb

需要手动添加依赖,但实现动态代理不局限于接口。

posted @ 2022-04-19 21:41  吉比特  阅读(405)  评论(0编辑  收藏  举报