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

菜鸟硕枫设计模式系列之13 代理模式二(动态代理)

阅读更多
java中的动态代理都需要实现一个实现了InvocationHandler接口的代理类,在该类中需要实现invoke方法,并且需要注入你想要代理的目标类对象实例。然后就可以对想要代理的方法进行操作了。

动态代理类图:
                               

具体demo示例:
对象接口
package invokeProxy;

public interface Person {

	void work();
	void play();
}


对象实例:
package invokeProxy;

public class Man implements Person{
	private String name;
	public Man(String name){
		this.name = name;
	}

	public void work() {
		System.out.println(name+" says Work is very hard");
	}

	public void play() {
		System.out.println(name+" says Playing is very funny");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}


动态代理:
package invokeProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxy implements InvocationHandler{

	private Man man;
	public DynamicProxy(Man man){
		this.man = man;
		
	}
	//参数说明:proxy 代理实例, method,目标方法,args数组,方法中参数
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		if(method.getName().equals("work")){
			System.out.println("the work method will be run.");
			method.invoke(man, null);
			System.out.println("the work method is finished.");
		}
		else
			method.invoke(man, null);
			
		return null;
	}

}


动态代理测试:
package invokeProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class DynamicProxyTest {

	public static void main(String[] args){
		Man man = new Man("lxy");
		InvocationHandler dynamicProxy = new DynamicProxy(man);
		
		Class<?> clazz = man.getClass();
  //三个参数都不能为空  也就是说被代理类必须有实现某一接口,而且有动态代理对象
		Person person = (Person) Proxy.newProxyInstance(clazz.getClassLoader(),
				clazz.getInterfaces(),dynamicProxy);
		
		person.work();
		person.play();
		
	}
	
}


说明:代理模式是设计模式的重要模式之一,动态代理模式又是java最重要特性反射的示例demo,要重点掌握哈。迭代器模式,观察者模式,三大工厂模式,外观模式是设计模式务必掌握的几个模式。
  • 大小: 12.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics