java 动态代理(模式) InvocationHandler(为类中方法执行前或后添加内容)
2013-12-08 21:06
501 查看
package test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
cls c = new cls();
invtest inv = new invtest();
itf i = inv.bind(c);
i.wosa();
i.wosa("str");
}
}
//定义接口
interface itf{
public abstract void wosa();
public abstract void wosa(String me);
}
//实现接口
class cls implements itf{
public void wosa() {
System.out.println("itf");
}
public void wosa(String str) {
System.out.println("wosa with property");
}
}
//实现代理
class invtest implements InvocationHandler{
private itf itfInstance;
private itf warpedItf; //这个不用定义成全局,无所谓。
invtest(){
}
//传入一个itf接口的类的对象,返还一个itf接口的类的对象,该返还对象比之前传入的类的方法多了些东西,多的东西在下面的invoke方法中可以看到
itf bind(itf i) {
itfInstance = i; //这个i就是要代理的对象,这个对象在invoke方法中还要用,所以定义成全局的。
warpedItf = (itf)Proxy.newProxyInstance(this.getClass().getClassLoader(),
new Class[] {itf.class}, this);
/*
Proxy.newProxyInstance会生成一个自身生成的代理类的对象,利用加载器(第一个参数)加载一个该方法自身生成的代理类到虚拟机中,关于这个加载器是不是必须用系统的加载器我没有测试,但是用系统的加载器不会出错,建议还是不要自定义加载器放在这里。这个代理类实现了一个接口数组(第二个参数)里面所有的接口的方法,并且按照第三个InvocationHandler参数的规则去实现这些方法。这个例子因为把Proxy放在其自身要使用的InvocationHandler里面所以直接传递this进去就行。
*/
return warpedItf;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//多出来的执行内容Start
if("wosa".equals(method.getName())){
System.out.println("invocationSuccess");
}
//多出来的执行内容End
return method.invoke(this.itfInstance, args);//每个方法的本体,如果没有这一句,就不会执行原来方法的内容。
}
/* public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("wosa".equals(method.getName())){
method.invoke(this.itfInstance, args);//每个方法的本体
System.out.println("invocationSuccess");
}
return null;
}
*/
}
更多内容请参阅API
其它参考链接之一:http://blog.csdn.net/aladdinty/article/details/3982007
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
cls c = new cls();
invtest inv = new invtest();
itf i = inv.bind(c);
i.wosa();
i.wosa("str");
}
}
//定义接口
interface itf{
public abstract void wosa();
public abstract void wosa(String me);
}
//实现接口
class cls implements itf{
public void wosa() {
System.out.println("itf");
}
public void wosa(String str) {
System.out.println("wosa with property");
}
}
//实现代理
class invtest implements InvocationHandler{
private itf itfInstance;
private itf warpedItf; //这个不用定义成全局,无所谓。
invtest(){
}
//传入一个itf接口的类的对象,返还一个itf接口的类的对象,该返还对象比之前传入的类的方法多了些东西,多的东西在下面的invoke方法中可以看到
itf bind(itf i) {
itfInstance = i; //这个i就是要代理的对象,这个对象在invoke方法中还要用,所以定义成全局的。
warpedItf = (itf)Proxy.newProxyInstance(this.getClass().getClassLoader(),
new Class[] {itf.class}, this);
/*
Proxy.newProxyInstance会生成一个自身生成的代理类的对象,利用加载器(第一个参数)加载一个该方法自身生成的代理类到虚拟机中,关于这个加载器是不是必须用系统的加载器我没有测试,但是用系统的加载器不会出错,建议还是不要自定义加载器放在这里。这个代理类实现了一个接口数组(第二个参数)里面所有的接口的方法,并且按照第三个InvocationHandler参数的规则去实现这些方法。这个例子因为把Proxy放在其自身要使用的InvocationHandler里面所以直接传递this进去就行。
*/
return warpedItf;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//多出来的执行内容Start
if("wosa".equals(method.getName())){
System.out.println("invocationSuccess");
}
//多出来的执行内容End
return method.invoke(this.itfInstance, args);//每个方法的本体,如果没有这一句,就不会执行原来方法的内容。
}
/* public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("wosa".equals(method.getName())){
method.invoke(this.itfInstance, args);//每个方法的本体
System.out.println("invocationSuccess");
}
return null;
}
*/
}
更多内容请参阅API
其它参考链接之一:http://blog.csdn.net/aladdinty/article/details/3982007
相关文章推荐
- java 动态代理(模式) InvocationHandler(为类中方法执行前或后添加内容)
- 代理模式之Java动态代理实现方法
- Java--代理模式(动态代理)
- 详解jQuery向动态生成的内容添加事件响应jQuery live()方法
- Java动态代理的两种实现方法
- 执行方法[置顶] aspectj动态代理
- java动态代理模式
- Java程序员从笨鸟到菜鸟之(三十九)大话设计模式(七)代理模式和java动态代理机制
- Java 中的代理模式及动态代理
- Java 动态代理 两种实现方法
- Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()
- Java动态代理的两种实现方法
- 代理模式(静态代理+动态代理)——JAVA
- Java JDK 动态代理的使用方法示例
- java 代理模式 jdk动态代理
- 从代理模式到Java动态代理
- java动态代理模式之Cglib动态代理机制
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- java动态代理的两种实现方法
- Java设计模式-动态代理研究分享