JDK动态代理示例
来源:互联网 发布:淘宝的同仁堂是真的吗 编辑:程序博客网 时间:2024/06/08 09:11
Java动态代理可以动态地创建代理并动态地处理对所代理方法的调用。
下面用《Java编程思想》中的一个例子说明:
首先是接口类,目标类要实现的接口:
public interface Interface { void doSomething(); void somethingElse(String args);}
再就是目标类,也可以成为真实类,继承上面的接口并实现其中的方法:
public class RealObject implements Interface { @Override public void doSomething() { System.out.println("I am doing something..."); } @Override public void somethingElse(String args) { System.out.println("doing something else"); }}
再就是创建一个代理对象,代理对象持有一个Object类型的引用(这说明可以代理任意类型的目标类?),代理对象的构造函数有一个Object类型的参数,用来初始化持有的引用。并且有一个主要的invoke方法。
代理类代码如下:
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DynamicProxyHandler implements InvocationHandler{ private Object proxied; public DynamicProxyHandler(Object proxied){ this.proxied = proxied; } public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{ System.out.println("**** proxy:" + proxy.getClass() + ", method:" + method + ", args:" + args); if(method.getName().equals("doSomething")){ System.out.println("detected the doSomething method!"); } if(args!=null){ for(Object obj:args){ System.out.print(obj+" "); } } return method.invoke(proxied,args); }}
最后是测试类,为目标类动态生成一个代理,并传递个消费者(要使用这个类的对象)。代码如下:
import java.lang.reflect.Proxy;public class SimpleDynamicProxy { public static void consumer(Interface iface){ iface.doSomething(); iface.somethingElse("bonobo"); } public static void main(String[] args){ RealObject real = new RealObject(); consumer(real); Interface proxy = (Interface) Proxy.newProxyInstance(Interface.class.getClassLoader(), new Class[]{Interface.class}, new DynamicProxyHandler(real)); consumer(proxy); }}
输出为:
I am doing something...doing something else**** proxy:class $Proxy0, method:public abstract void proxy.Interface.doSomething(), args:nulldetected the doSomething method!I am doing something...**** proxy:class $Proxy0, method:public abstract void proxy.Interface.somethingElse(java.lang.String), args:[Ljava.lang.Object;@13785d3bonobo doing something else
通过调用静态方法Proxy.newProxyInstance()可以创建动态代理,这个方法需要一个类加载器,通常可以从已经被加载的对象中获取其加载器,然后传递给它;还需要一个你希望该代理实现的接口列表;以及InvocationHandler接口的一个实现。
invoke方法中传递进来了代理对象,以防你需要区分请求的来源,但是在许多情况下,你并不关心这一点。然而在invoke()内部,在代理上调用方法时需要格外小心,因为对接口的调用将被重定向为对代理的调用。
0 0
- JDK动态代理示例
- JDK动态代理示例
- jdk动态代理示例以及代码原理分析
- 动态代理-JDK 源码剖析(一):简单示例
- 代理模式,JDK动态代理
- Java动态代理--jdk代理
- 代理模式-JDK动态代理
- JDK中的动态代理
- JDK动态代理
- JDK动态代理
- JDK动态代理
- jdk动态代理(暂)
- JDK动态代理
- JDK动态代理实例
- jdk 动态代理
- JDK动态代理
- JDK动态代理说明
- jdk动态代理
- 圆形头像
- eMule 的使用场景及初始化任务描述级eMule相关代码分析(仅涉及ed2k)
- 使用负载均衡之后的Session处理思路
- vtk实战(三十)——写入vtu数据
- LightOJ 1042 Secret Origins【位运算】
- JDK动态代理示例
- ACM--BFS--图--nyoj 20--吝啬的国度
- Hadoop内置的数据输入\输出格式与RecordReader\RecordWriter(九)
- 网页缩放
- 【LeetCode】Perfect Squares 解题报告
- 应用层数据库读写分离--续
- java语法break、continu、label语句
- nova boot代码流程分析(三):nova与neutron的plugin交互
- Android 监听短信内容变化,并发送到自己的手机