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();

}
}

执行结果
代理对象中的方法执行了
***在学习
代理对象中的方法执行结束了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




posted @ 2018-12-27 23:48  Java半路人生  阅读(222)  评论(0)    收藏  举报