动态代理设计模式
由于静态代理设计模式,在代理功能比较多时,代理类中方法需要写很多,
为了解决镜头代理频繁编写代理功能缺点,引入了动态代理。
接口
package com.fd.proxy.dynamic; public interface Func { public void A(); public void B(); public void C(); }
真实类
package com.fd.proxy.dynamic; public class MyProxy implements Func{ @Override public void A() { System.out.println("Proxy A"); } @Override public void B() { System.out.println("Proxy B"); } @Override public void C() { System.out.println("Proxy C"); } }
代理类 代理类需要实现InvocationHandler,通过反射机制进行调用真实类的方法
package com.fd.proxy.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Agent implements InvocationHandler{ private MyProxy proxy = new MyProxy(); @Override public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { System.out.println("Agent Before Method"); Object obj = arg1.invoke(proxy, arg2); System.out.println("Agent After Method"); return obj; } }
测试
package com.fd.proxy.dynamic; import java.lang.reflect.Proxy; public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub Agent agent = new Agent(); Func func = (Func)Proxy.newProxyInstance(TestMain.class.getClassLoader(), new Class[] {Func.class}, new Agent()); func.A(); func.B(); func.C(); } }