微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2EE >

AOP面向切面编程(4)

时间:2017-01-12 04:01  浏览:努力统计中...
*/ private Object target = null ; /* 通过构造函数传入原对象 */ public ArithmeticCalculatorInvocationHandler(Object target) { this .target = target; } /* InvocationHandler接口的方法,p
*/
private Object target = null;

/*通过构造函数传入原对象*/
public ArithmeticCalculatorInvocationHandler(Object target)
{
this.target = target;
}

/*InvocationHandler接口的方法,proxy表示代理,method表示原对象被调用的方法,args表示方法的参数*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
/*原对象方法调用前处理日志信息*/
System.out.println("the method ["+method.getName()+"]"+"begin with args ("+Arrays.toString(args)+")");

Object result = method.invoke(this.target, args);

/*原对象方法调用后处理日志信息*/
System.out.println("the method ["+method.getName()+"]"+"end with result ("+result+")");

return result;
}

/*获取代理类*/
public Object getProxy()
{
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.getClass().getInterfaces(), this);
}
}

场景类调用:

public class Client
{
public static void main(String[] args) throws Exception
{
/*获得代理*/
Calculator arithmeticCalculatorProxy = (Calculator)new ArithmeticCalculatorInvocationHandler(
new ArithmeticCalculator()).getProxy();

/*调用add方法*/
arithmeticCalculatorProxy.add(10, 10);
}
}

控制台的输出:

the method [add]begin with args ([10.0, 10.0])
the method [add]end with result (20.0)

可以看到使用动态代理实现了横切关注点。

若需要添加参数验证功能,只需要再创建一个参数验证代理即可:

public class ArithmeticCalculatorArgsInvocationHandler implements
InvocationHandler
{
/*要代理的对象,动态代理只有在运行时才知道代理谁,所以定义为Object类型,可以代理任意对象*/
private Object target = null;

/*通过构造函数传入原对象*/
public ArithmeticCalculatorArgsInvocationHandler(Object target)
{
this.target = target;
}

/*InvocationHandler接口的方法,proxy表示代理,method表示原对象被调用的方法,args表示方法的参数*/
@Override

顶一下
(1)
100%
踩一下
(0)
0%
------分隔线------
栏目列表
推荐内容