java中的动态代理都需要实现一个实现了InvocationHandler接口的代理类,在该类中需要实现invoke方法,并且需要注入你想要代理的目标类对象实例。然后就可以对想要代理的方法进行操作了。
动态代理类图:
[img]http://dl.iteye.com/upload/attachment/364557/9fa8283b-9222-3586-9583-19650746cbba.jpg[/img]
具体demo示例:
对象接口
对象实例:
动态代理:
动态代理测试:
说明:代理模式是设计模式的重要模式之一,动态代理模式又是java最重要特性反射的示例demo,要重点掌握哈。迭代器模式,观察者模式,三大工厂模式,外观模式是设计模式务必掌握的几个模式。
动态代理类图:
[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,要重点掌握哈。迭代器模式,观察者模式,三大工厂模式,外观模式是设计模式务必掌握的几个模式。