码迷,mamicode.com
首页 > 编程语言 > 详细

Java 动态代理

时间:2014-12-27 17:34:20      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:动态代理   反射   invoke   

    动态代理是在程序动态执行时去生成的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 动态代理

标签:动态代理   反射   invoke   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!