您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: