在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。
代理模式的设计思想:是通过代理的方式避免暴露被代理对象或者说代理不容易被取得的对象
public class CalculatorProxy {
/**
* 为传入的参数对象创建一个动态代理对象
* @param calculator 参数对象
* @return 动态代理对象
*/
public static Object getProxy(final Calculator calculator){
/*
* Proxy:为目标对象创建代理对象;相当于Proxy也是实现了Calculator接口
*
* 参数
* loader:目标对象的类加载器
* interfaces:目标对象实现的所有接口;如果没有实现任何接口,就会报错
* InvocationHandler:方法执行器对象
*/
return Proxy.newProxyInstance(calculator.getClass().getClassLoader(), calculator.getClass().getInterfaces(), new InvocationHandler() {
/**
*
* @param proxy 代理对象;给jdk使用。任何时候都不要动这个对象
* @param method 当前将要执行的目标对象的方法
* @param args 这个方法调用时外界传入的参数值
* @return 真正执行后的返回值
* @throws Throwable 代理异常
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//利用反射执行目标对象的方法
Object result = null;
try{
LogUtils.logStart(method,args);
result = method.invoke(calculator,args);
LogUtils.logReturn(method,result);
}catch (Exception e){
LogUtils.logException(method,e);
}finally {
LogUtils.logEnd(method);
}
return result;
}
});
}
}
以下的类就可以对目标对象进行需要的操作
public class LogUtils {
public static void logStart(Method method, Object[] args) {
System.out.println("【"+method.getName()+"】方法开始执行,用的参数列表【"+ Arrays.asList(args)+"】");
}
public static void logReturn(Method method, Object result) {
System.out.println("【"+method.getName()+"】方法正常执行完成,结果是:"+result);
}
public static void logException(Method method, Exception e) {
System.out.println("【"+method.getName()+"】方法执行出现异常了,异常信息是:"+e.getCause()+";这个异常已经通知测试小组进行排查");
}
public static void logEnd(Method method) {
System.out.println("【"+method.getName()+"】方法最终结束了");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69811.html