黑马程序员-动态代理

来源:互联网 发布:实况足球mac迅雷下载 编辑:程序博客网 时间:2024/05/19 16:32

------- android培训、java培训、期待与您交流! ----------

出现动态代理技术的原因:我们经常会用到某个类的某个方法,但是,很多时候仅仅使用这些方法是不够的,因为有时我们希望在使用这些方法之前或之后能执行一些我们所希望执行的代码(例如输出日志或者记录方法执行时所消耗的时间),而我们又无法修改(甚至无法得到)这些方法所在类的源码,正是基于这样的原因,动态代理技术产生了。

需要了解的几个名词:①目标对象(类):就是我们希望给它的方法添加其他功能那个对象。②Advice:建议或者是功能,也就是我们希望添加到目标对象的目标方法上的功能。

③代理:与目标对象继承了相同接口的类,而且封装了我们所希望的Advice

动态代理技术的原理:通过给代理添加功能,然后在执行目标对象的目标方法的时候,会首先执行代理的方法,然后在代理方法的内部通过反射技术执行目标对象的方法,最后返回目标对象方法的执行结果。这样一来,我们就可以在代理的方法执行目标对象的方法之前或之后,添加一些我们希望的功能代码,从而实现了既丰富了目标对象方法的功能,又不修改目标类的想法。需要牢记一点,代理类必须继承目标类的相应接口,否则在调用代理对象的时候就无法通过反射技术来调用目标对象的同名方法了。也就没法代理了

动态代理技术的一些常用API:java.lang.reflect.Proxy   java.lang.reflect.InvocationHandler


动态代理举例


功能接口

package along.proxy.test;import java.lang.reflect.Method;public interface Advice {Object doSomething(Object target,Method method,Object[]args);}

功能类

package along.proxy.test;import java.lang.reflect.Method;public class MyAdvice implements Advice {@Overridepublic Object doSomething(Object target, Method method, Object[] args) {Object returnVal = null;try {System.out.println("do something before " + method.getName());returnVal = method.invoke(target, args);System.out.println("do something after " + method.getName());} catch (Exception e) {e.printStackTrace();} return returnVal;}}

代理实现类

package along.proxy.test;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.ArrayList;import java.util.Collection;import org.junit.Test;public class ProxyTest {@SuppressWarnings({ "unchecked", "rawtypes"})@Testpublic void testProxy() throws Exception {//目标对象Collection target = new ArrayList();//系统功能Advice advice = new MyAdvice();//目标对象的代理Collection collection = (Collection)getProxy(target,advice);System.out.println(collection.add(1));System.out.println();System.out.println(collection.size());}private Object getProxy(final Object target,final Advice advice) {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method,Object[] args) throws Throwable {Object returnVal = advice.doSomething(target, method, args);return returnVal;}});}}

以后我们要给哪个类的目标对象添加代理,就可以把目标对象和要添加的功能对象传递给
private Object getProxy(final Object target,final Advice advice)
方法,该方法就会为我们返回一个该目标类对象的代理对象。当然,我们需要提前准备好target对象和advice对象。advice对象就是我们的功能对象,我们需要实现Advice接口来添加我们的功能。
原创粉丝点击