Java动态代理
来源:互联网 发布:知乎怎么找到匿名回答 编辑:程序博客网 时间:2024/05/16 07:49
代理,就是需要代理类和被代理类有相同的对外接口或者说成服务,所以代理类一般都必须实现了所有被代理类已实现的接口,因为接口就是制定了一系列对外服务的标准。
正因为动态代理有这样灵活的特性,所以我们在设计动态代理类(DynamicProxy)时不用显式地让它实现与真实主题类(RealSubject)相同的接口(interface),而是把这种实现推迟到运行时。
为了能让DynamicProxy类能够在运行时才去实现RealSubject类已实现的一系列接口并执行接口中相关的方法操作,需要让DynamicProxy类实现JDK自带的java.lang.reflect.InvocationHandler接口,该接口中的invoke()方法能够让DynamicProxy实例在运行时调用被代理类的“对外服务”,即调用被代理类需要对外实现的所有接口中的方法,也就是完成对真实方法的调用,Java帮助文档中称这些真实方法为处理程序。
我们肯定必须先把被代理类RealSubject已实现的所有interface都加载到JVM中,不然JVM怎么能够找到这些方法呢?明白了这个道理,那么我们就可以创建一个被代理类的实例,获得该实例的类加载器ClassLoader。
所谓的类加载器ClassLoader,就是具有某个类的类定义,即类的内部相关结构(包括继承树、方法区等等)
动态代理模式可以使得我们在不改变原来已有的代码结构的情况下,对原来的“真实方法”进行扩展、增强其功能,并且可以达到控制被代理对象的行为的目的。DynamicProxy类必须实现的invoke()方法在调用被代理类的真实方法的前后都可进行一定的特殊操作。这是动态代理最明显的优点
为了解决某些问题,比如,不允许直接访问某些类;对访问要做特殊处理等。或者,要对原方法进行统一的扩展,出现了动态代理需求
类图
JDK动态代理中包含一个类和一个接口:
InvocationHandler接口:
public interface InvocationHandler { public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; }
参数说明:
Object proxy:指被代理的对象。
Method method:要调用的方法
Object[] args:方法调用时所需要的参数
可以将InvocationHandler接口的子类想象成一个代理的最终操作类
接口中声明的所有方法都被转移到一个集中的方法中处理(invoke)
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
主题接口
public interface ISubject {void doSomething();}
真实对象
public class RealSubject implements ISubject {@Overridepublic void doSomething() {System.out.println("+++RealSubject+++");}}
handler
public class SubHandler implements InvocationHandler {private Object obj;// 持有真实对象public SubHandler(Object obj) {this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object result = method.invoke(obj, args);// 真实对象来执行具体的方法System.out.println("dy proxy ");//加入自己操作return result;}}
使用
public class Test {public static void main(String[] args) {RealSubject realSubject = new RealSubject();ISubject sub = (ISubject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(),new SubHandler(realSubject));sub.doSomething();}}
//output
+++RealSubject+++
dy proxy
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- leetcode[96]:Unique Binary Search Trees
- hdu5311 Hidden String dp找字符串前缀
- hdu 5311 Hidden String
- Android之BLE编程
- ubuntu 卷boot空间不足问题解决
- Java动态代理
- dfs 拯救行动
- ListBuffer、ArrayBuffer、Queue、Stack操作代码实战
- HDOJ题目3440 House Man(差分约束)
- Java实现线程阻塞的两种方式
- MySQL 初次装时密码为空 为其设置新密码
- SSL/TLS单向双向认证原理
- MySQL 5.6 for Windows 解压缩版配置安装
- Linux使用Java将C++程序发布为webservice(wsdl)