`
小网客
  • 浏览: 1218719 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java动态代理模式

    博客分类:
  • Java
 
阅读更多

动态代理是为了弥补静态代理的不足,概念等同于普通的代理模式,在实现上稍有区别。

涉及一个接口一个类:

InvocationHandler
Proxy

角色代码准备:

抽象角色:

public interface IBook {
	String getBookName();

	String getBookPress();
}

真实角色:

public class JavaBook implements IBook {

	@Override
	public String getBookName() {
		return "Java 程序设计";
	}

	@Override
	public String getBookPress() {
		return "上海科学出版社";
	}

}

其他行为:

public class Something {
	public void start() {
		System.out.println("获取图书价格成功");
	}

	public void end() {
		System.out.println("后续可以阅读");
	}
}

代理角色:

public class DynamicProxyBook implements InvocationHandler {
	private Object target;
	private Object others;

	public Object bind(Object target, Object others) {
		this.others = others;
		this.target = target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass()
		        .getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Class clazz = this.others.getClass();
		Method start = clazz.getDeclaredMethod("start");
		
		start.invoke(this.others);
		Object result = method.invoke(target);
		System.out.println("result:"+result);
		Method end = clazz.getDeclaredMethod("end");
		start.invoke(this.others);
		return result;
	}

}

测试代码:

public static void main(String[] args) {
	IBook book = (IBook) new DynamicProxyBook().bind(new JavaBook(), new Something());
	book.getBookName();
	book.getBookPress();
}

 

不足:

1.接口必须有具体的显示实现类而不能动态绑定

 

3
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics