----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
看完了张孝祥老师的基础加强篇,发觉后面的动态代理知识相对抽象一时还不能完全理解,所以查找了很多资料,在此整理一下自己的收获,总结对动态代理的理解。
开篇还是拿张老师经典的例子买电脑来说明,正常情况下我们有两种方法可以买到电脑,要么找代理商,要么找总部,虽然总部的电脑会便宜,但算上路费可能就贵了,所以招代理应该是最划算的;显然代理类可以代替实际类大部分的功能,是客户端与目标对象之间的桥梁,甚至使一些目标对象不便完成的任务做的很完美,代理类可以使客户不具备访问目标对象的某些数据,提高安全性。
java从jdk1.3开始引入动态代理类的概念,动态代理可以提高代码额可复用性,多不同的类需要实现相同的功能,不必在每个类里面都写上相同的代码,通过一个动态的代理类就会方便很多,提高编程效率,这样若是后期想改变代码也会很方便。代理模式是生成和目标类相同接口的代理类,用户通过使用代理类来封装某个实现类,动态代理中的代理类由java.lang.reflect.Proxy类在运行时由接口定义,采用java反射功能动态生成。与java.lang.reflect.InvocationHandler结合,加强现有类的实现,通过自定义Hander重写invoke方法实现InvocationHandler接口,该方法可以利用反射机制实现特定功能,自定义Hander实例化时,将实现类传入Hander对象
import java.lang.reflect.Method;
public interface Advice {
public void beforMethod();
public void endMethod(Method method);
}
public class Myadvice implements Advice {
long startTime;
public void beforMethod() {
startTime=System.currentTimeMillis();
}
public void endMethod(Method method) {
long endTime=System.currentTimeMillis();
System.out.println(method.getName() + "方法运行时间:" + (endTime - startTime)+ "毫秒");
}
}
public class ProxyDemo {
public static void main(String[] args)throws Exception {
final ArrayList target=new ArrayList();
Collection col=(Collection)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
advice.beforMethod();
System.out.println(Thread.currentThread());
Thread.currentThread().sleep(100);
Object retVal=method.invoke(target, args);
advice.endMethod(method);
return retVal;
}});
col.add("123");
col.add("234");
System.out.println(col.size());
}
}
以上的代码只体现了代理类的实现方式,目标类通过代理控制这个对象的访问,说白了就是在特定情况下让客户看不到目标类的一些类容和服务,同时代理类也可以提供额外的服务,比如买电脑,电脑厂家值提供电脑,而代理上也可以通过送鼠标垫的方式吸引客户。
其实代理类的知识远不止如此,需要学的还有很多,继续努力!
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------