您的位置:首页 > 其它

动态代理

2016-01-26 22:19 183 查看
反射

1.java.lang.Class是反射的源头 涉及的反射的类在java.lang.reflect子包下 如Field Method Contrustor Type Package..

当通过Class实例调用getMethods()-->Method.getConstructors()-->Constructor

实例化Class方法(三种)

.class getClass() froName()

非公共的类调用方法加DeClared 如getDeleclaredConstructor 还得调用set.Accessble(true)

2.clazz.getMethods();获取对应的运行类中声明的权限为public方法(包含其父类声明的poblic)

class.getDeclaredMethods获取对应运行类中声明的所有方法(任何权限修饰符都能获取不含父类中的)

调用指定的方法时用最后invoke调用

静态代理 要求被代理类和代理类同时实现相应的一套接口 通过被代理类的对象调用重写接口的方法时 实际上执行的是被代理类的同样的方法调用

动态代理 在程序运行时 根据被代理类及其实现的接口 动态的创建一个代理类 ,当调用代理列的实现的抽象方法时 就发起被代理类同样的方法的调用(涉及到的技术,1实现了InvocationHandler接口实现类 并重写inoke()方法)

2Proxy.newInstance(obj.getClass().getClassLoade(),obj.getClass().Interfaces(),h)

注:obj被代理类对象 h实现了invacationHander接口的实现类对象

动态代理 接口中声明的所有方法都被转移到调用处理器一个集中方法处理

这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。

抽象类。实现对抽象类的动态代理

当通过代理类的对象发起对被重写的方法调用时 都会转为对invoke方法的调用

1被代理类的对象

2创建一个实现了InvacationHandler接口的类的对象

重写invoke();

3动态的创建一个代理类对象 return Proxy.newInstance(obj.getClass().getClassLoade(),obj.getClass().Interfaces(),h)

4 main{

SupperMan man = new SupperMan();//创建一个被代理类的对象

Object obj = MyProxy.getProxyInstance(man);//返回一个代理类的对象

Human hu = (Human)obj;

hu.info();//通过代理类的对象调用重写的抽象方法

调用xx方法 动态的返回一个同样实现了 被代理对象所在类实现的接口xx的代理类的对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: