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

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

动态代理类图:
[img]http://dl.iteye.com/upload/attachment/364557/9fa8283b-9222-3586-9583-19650746cbba.jpg[/img]

具体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,要重点掌握哈。迭代器模式,观察者模式,三大工厂模式,外观模式是设计模式务必掌握的几个模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值