特点:许多解决解决问题的方法中的共同点提取出来。实现时利用java api的代理类实现,需要对工具类进行学习。
实际情况:需要对某个对象或一组对象,进行功能扩展,动态增加和取消特定功能。如日志记录功能。
优点是:把我们的代理对象和被代理对象解藕,代理者和操作者解藕。
缺点:
实现:
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.Method;
public interface IOperation {
<wbr><wbr><wbr><br><wbr><wbr><wbr> void start(Method method);<br><wbr><wbr><wbr><br><wbr><wbr><wbr> void end(Method method);<br>
}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
实现上面接口的类.生成一个真正的操作者,如下面是日志操作者的一个类:
LoggerOperation.java
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.Method;
public class LoggerOperation implements IOperation {
<wbr><wbr><wbr> public void end(Method method) {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Logger.logging(Level.DEBUGE, method.getName() + " Method end .");<br><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr> public void start(Method method) {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Logger.logging(Level.INFO, method.getName() + " Method Start!");<br><wbr><wbr><wbr> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
}
然后我们要改一下代理对象DynaProxyHello中的代码.如下:
package sinosoft.dj.aop.proxyaop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynaProxyHello implements InvocationHandler {
<wbr><wbr><wbr><br><wbr><wbr><wbr> private Object proxy;<br><wbr><wbr><wbr><br><wbr><wbr><wbr><br><wbr><wbr><wbr> private Object delegate;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>//这个band的方法参数有几个有没有约定?<wbr><br><wbr><wbr><wbr> public Object bind(Object delegate,Object proxy) {<wbr><wbr><wbr><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> this.proxy = proxy;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> this.delegate = delegate;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return Proxy.newProxyInstance(<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> this.delegate.getClass().getClassLoader(), this.delegate<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> .getClass().getInterfaces(), this);<br><wbr><wbr><wbr> }<br><wbr><wbr><wbr><br><wbr><wbr><wbr> public Object invoke(Object proxy, Method method, Object[] args)<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> throws Throwable {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Object result = null;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> try {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //反射得到操作者的实例<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Class clazz = this.proxy.getClass();<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //反射得到操作者的Start方法<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Method start = clazz.getDeclaredMethod("start",<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> new Class[] { Method.class });<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //反射执行start方法<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> start.invoke(this.proxy, new Object[] { method });<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //执行要处理对象的原本方法<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> result = method.invoke(this.delegate, args);<br> //<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> 反射得到操作者的end方法<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> Method end = clazz.getDeclaredMethod("end",<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>