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

Java 动态代理

2014-12-27 16:41 267 查看
动态代理是在程序动态执行时去生成的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方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: