首页 > 编程语言 > 详细

Java 动态代理

时间:2014-12-27 17:33:57      阅读:258      评论:0      收藏:0      [点我收藏+]

    动态代理是在程序动态执行时去生成的class,在生成时要提供一组interface给它,然后该class就宣称实现了这些接口,生成的代理对象不会做实质性的工作,比如增加其他业务逻辑等,在生成实例时必须提供一个handler,由它来接管工作,是加上应用的就是反射技术。

代码:

生命被代理对象所实现的接口

public interface SubjectInf {
	String Say(String name);
}

被代理对象的具体实现:

public class SubjectImpl implements SubjectInf {
	@Override
	public String Say(String name) {
		// TODO Auto-generated method stub
		return "hello"+name;
	}

}

实现一个handler
public class SubjectDyanmic implements InvocationHandler {

	private SubjectImpl subject;
	public SubjectDyanmic(SubjectImpl subject) {
		super();
		this.subject = subject;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("invoke run..." );
		if (args == null) {
			method.invoke(subject, args);
			return null;
		} else
		{
		     String res = (String) method.invoke(subject, args);
			 return res;
		}
	}
}


测试Client
public class Client {

	public static void main(String[] args) {
		SubjectImpl sub =new SubjectImpl();
		InvocationHandler handler = new SubjectDyanmic(sub);
   	    System.out.println("进入前");
		//生成代理对象
		SubjectInf subinf = (SubjectInf)Proxy.newProxyInstance(sub.getClass().getClassLoader()
				             ,sub.getClass().getInterfaces(), handler);
	     System.out.println("代理生成完毕");
		/***
		 * 当要执行被代理对象的某个方法时会立即执行handler里面的invoke方法(反射),
	         * 不执行被代理对象的某个方法时不会执行handler的方法
		 */
	     String res=subinf.Say("Li");
     	System.out.println(res);
	}
}
</pre><pre>

程序输出:

进入前
代理生成完毕
invoke run...
helloLi

如果我们测试Clinent不调用被代理对象的某个方法时 输出:

进入前
代理生成完毕
helloLi

 可见动态代理实质是分为两大块,一个是生成代理对象,再者是根据java反射去执行被代理对象的一些方法,即调用invoke方法。


Java 动态代理

原文:http://blog.csdn.net/liyantianmin/article/details/42194123

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!