JDK动态代理使用实例
程序员文章站
2022-04-19 17:16:06
...
1. 创建业务接口,包含着业务对外可以提供的功能,也就包含着被代理的内容。
public interface Userservice {
/**
* 目标方法
*/
public abstract void add();
}
2.创建业务接口实现类
public class UserServiceImpl implements Userservice {
public void add() {
System.out.println("---------add-----------");
}
}
3.创建自定义InvocationHandler,用于对接口提供的方法进行增强。
public class MyInvocationHandle implements InvocationHandler {
/**
* 持有目标对象
*/
private Object target;
/**
* 构造方法
* @param target
*/
public MyInvocationHandle(Object target) {
super();
this.target = target;
}
/**
* 执行目标的方法
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("在方法之前打印----------before----------");
//执行目标对象方法
Object result = method.invoke(target, args);
System.out.println("在方法之后打印----------after----------");
return null;
}
/**
* 创建代理类
* @return
*/
public Object getProxy() {
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
target.getClass().getInterfaces(), this);
}
}
4.最后进行测试,验证对于接口进行的增强是否起到作用
public class ProxyTest {
public static void main(String[] args) {
//实例化目标对象
Userservice userservice = new UserServiceImpl();
//实例化InvocationHandler
MyInvocationHandle invocationHandle = new MyInvocationHandle(userservice);
//根据目标接口(对象)生成代理对象
Userservice proxy = (Userservice) invocationHandle.getProxy();
//执行代理对象的方法
proxy.add();
}
}
执行结果展示:
以上例子可以说就是spring AOP 的简单实现,在目标对象的方法执行之前和执行之后都进行了增强处理。
再次回顾使用JDK代理的方式,在整个创建过程中,对于InvocationHandler的创建是最核心的,在自定义的InvocationHandler中需要重写三个函数。
- 构造函数,将代理的对象传入
- invoke方法,此方法实现了方法增强的逻辑。
- getProxy方法。
推荐阅读