jdk中的动态代理
在复习spring的知识的时候,看见aop编程。想到了动态代理,复习了一下。
使用jdk的动态代理。需要有接口,目标类需要实现接口。
长时间不用,容易忘,
下面写了一个今晚复习的实例
第一步:定义一个接口
public interface UserService {
/**
* 学习
*/
void study();
}
第二步:定义一个实现类
public class UserServiceImpl implements UserService {
@Override
public void study() {
System.out.println("***在学习");
}
}
第三步:重要的一步,定义一个动态代理类,实现InvocationHandler接口
public class DymaicInvocationHandler implements InvocationHandler {
/**
* 1. 创建一个目标对象引用
*/
private Object target;
/**
* 2. 通过构造方法赋值,给目标对象赋值
* @param target
*/
public DymaicInvocationHandler(Object target) {
this.target = target;
}
/**
* 3. 重写,代理对象中的invoke方法。在执行method.invoke()方法的时候,
可以在该方法执行前后加入相应的业务逻辑。
* @param proxy 代理对象
* @param method Method对象
* @param args 目标对象执行的方法的参数
* @return 方法的执行结果
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 添加方法执行前的逻辑增强
System.out.println("代理对象中的方法执行了");
// 通过反射,执行目标方法
Object object = method.invoke(target, args);
// 添加方法执行后的逻辑增强
System.out.println("代理对象中的方法执行结束了");
// 返回
return object;
}
/**
* 4. 获取代理对象
* @return
*/
public Object getProxy(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this);
}
}
在上面可以通过方法中的getProxy()方法获取代理对象。也可以通过下面的方法单独创建一个工具类的方式,来获取代理对象
public class InvocationHandlerUtil {
public static Object getProxy(Object target){
DymaicInvocationHandler invocationHandler = new DymaicInvocationHandler(target);
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
invocationHandler);
return proxy;
}
}
5. 编写一个测试类
public class MainTest {
public static void main(String[] args) {
UserService proxy = (UserService) InvocationHandlerUtil.getProxy(new UserServiceImpl());
proxy.study();
}
}
执行结果
代理对象中的方法执行了
***在学习
代理对象中的方法执行结束了

浙公网安备 33010602011771号