初学者硕枫设计模式系列之13 代理模式二(动态代理)
菜鸟硕枫设计模式系列之13 代理模式二(动态代理)
java中的动态代理都需要实现一个实现了InvocationHandler接口的代理类,在该类中需要实现invoke方法,并且需要注入你想要代理的目标类对象实例。然后就可以对想要代理的方法进行操作了。
动态代理类图:

具体demo示例:
对象接口
对象实例:
动态代理:
动态代理测试:
说明:代理模式是设计模式的重要模式之一,动态代理模式又是java最重要特性反射的示例demo,要重点掌握哈。迭代器模式,观察者模式,三大工厂模式,外观模式是设计模式务必掌握的几个模式。
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,要重点掌握哈。迭代器模式,观察者模式,三大工厂模式,外观模式是设计模式务必掌握的几个模式。