今天,自己学习了下javaAPI的动态代理,并查阅了网上的一些关于动态代理的文章。有心把自己的理解写下。
动态代理最重要是有一个Proxy类,还有一个InvocationHandler接口。一般理解了这两个那么对于动态代理应该也就理解了。
Proxy类里面有一个方法是newPorxyInstance(ClassLoader loader,Class<?>[] interfaces , InvocationHandler h) throws IllegalArgumentException.
这个方法是用于创建一个proxy对象,
至于参数loader可以是装载我们的目标类(待会说明)或者目标类所实现的接口的类装载器。
interfaces是我们要创建的那个proxy所要实现的那些接口。
h 则是与我们要创建的这个proxy绑定的执行处理器(InvocationHandler)。
每一个proxy的实例都有一个与之绑定的执行处理器,并且当该proxy执行一个方法的时候,他会把这个方法的执行分配给这个执行处理器的invoke方法去执行。接着就要谈谈执行处理器(InvocationHandler)了。
InvocationHandler接口里面有一个invoke方法。里面的参数我也就不一一说明了,大家可以看看API里面的说明,因为我也是看API的。这篇文章几乎都是API里面的内容。提醒一点就是每一个InvocationHandler的实现类里面都有应该要保留一个目标类的一个引用,以便调用方法的时候可以用到。接下来我用一个实例说明一下。
package com.vocation.test.proxy;
public interface Realizable { //这个接口是目标类和proxy应该共同实现的接口。
public void doThings(String process);
}
package com.vocation.test.proxy;
下面这个是一个目标类实现了上面的接口。上面提到的loader可以是装在我们这个目标类所使用的classLoader。
public class Target implements Realizable {
@Override
public void doThings(String process) {
System.out.println(process);
}
}
下面这个类则是用来对从客户端到目标类的额外处理。相当于一个过滤的中间处理层吧。
package com.vocation.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class TargetHandler implements InvocationHandler{
private Object target ;//目标类的一个应用以便下面invoke方法中method的invoke方法使用。
public TargetHandler(){
}
public TargetHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("I am dreaming ...");
method.invoke(target, args);
System.out.println("My dream come true ...");
return null;
}
}
最后我们看看我们的客户端怎样来调用。
package com.vocation.test.proxy;
import java.lang.reflect.Proxy;
public class StartLife {
public static void main(String [] args) {
//创建一个目标类
Target target = new Target();
//创建一个处理目标类的方法的一个处理器
TargetHandler targetHandler = new TargetHandler(target);
//ClassLoader也可以是装载目标类的装载器,Class数组是要创建的这个proxy实例所要实现的所有接口,InvocationHandler是我们用来处理目标类的处理器。
Realizable realizableTarget = (Realizable)Proxy.newProxyInstance(Realizable.class.getClassLoader(), new Class[] {Realizable.class}, targetHandler);
//直接调用代理类的方法,然后该代理类会把方法的执行分配给其绑定的执行处理器的invoke方法去执行。
realizableTarget.doThings("I am working hard, working hard, working hard ...");
}
}
以下是执行的结果:
I am dreaming ...
I am working hard, working hard, working hard ...
My dream come true ...
如果需要更详细的信息,希望大家参考API。
分享到:
相关推荐
java 反射与动态代理Reflection&DynamicProxy,源码展示
package cn.sxt.dynamicproxy; import java.util.ArrayList; import java.util.List; import cn.sxt.service.UserService; import cn.sxt.service.UserServiceImpl; public class Client { public ...
java static proxy dynamic proxy
NULL 博文链接:https://lionkingzw-hotmail-com.iteye.com/blog/485923
Java动态代理 动态代理实现
java 动态代理的前世今生 dynamic proxy in java
动态代理一个简单实用的JDK动态代理演示
本文的标签:1,aop,dynamic,java,proxy, 动态代理,动态代理机制分析及扩展,动态代理机制分析及扩展,第,部分标记本文!Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及...
JAVA AOP例子, 包括cglib, jsvassist, dynamicProxy
└─dynamicproxy └─src └─com └─dynamicproxy ├─entity │ Subject.java │ ├─entityimpl │ SubjectImpl.java │ ├─main │ Test.java │ └─proxy AbstractDynamicProxy.java ...
<artifactId>dynamicproxy <version>1.0.0 接下来,让我们看一些实现动态代理的例子。 1.2 创建调用者 首先,让我们定义一个接口。 public interface EchoService { String echo(String message); } 通过使用运行时...
本资源利用文档加源码的方式较详细的介绍了JDK 动态代理和Spring的AOP机制.相信对您理解相关方面的知识有很大作用.
spring_dynamic_proxy:基于接口基于子类的动态代理
import java.lang.reflect.Proxy; import java.util.Collection; import java.util.Vector; public class ProxyTest { public static void main(String[] args) { System.out.println(Integer.class.getClassLoader...
因目前公司客户端采用delphi7开发,与服务器...本例采用Dynamic Proxy方式,WSDD方式 delphiclient 是用delphi7写的WebService客户端 里面的地址请根据实际情况调整 效果很简单,点一下访问Webservice弹出一个对话框
java_base Java语言及高级特性学习工程目录base_...super_class:super()方法替换执行父类的无参构造函数useClass:类类的使用dynamic_proxy java JDK及第三方库CGLIB实现的两个动态代理socket_proj java socket编程
java7 源码 test1 版本更新 ...14、java核心技术第二章源码--com.java7book.chapter2.dynamicproxy. 15、方法句柄的例子--invoke包。 16、方法句柄的使用--TestInvoke. 17、excle的读取--TestExcel.java
Mature AOP tools like PostSharp and Castle DynamicProxy now offer .NET developers the level of support Java coders have relied on for years. About this Book AOP in .NET introduces aspect-oriented ...