1、需要代理的类 /** * 需要动态代理的接口 */ public interface Subject { public String sayHello(); }
import com.it.service.Subject; /** * 实际对象 */ public class RealSubject implements Subject { @Override public String sayHello() { return "Hello"; } }
2.代理类
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 调用处理器实现类 * */ public class InvocationHandlerImpl implements InvocationHandler { // 需要代理的真实对象 private Object subject; public InvocationHandlerImpl(Object subject) { this.subject = subject; } /** * * @param proxy 代理对象 * @param method 方法对象 * @param args 方法参数 * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("调用方法之前"); // 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用 Object result = method.invoke(subject, args); System.out.println("调用方法之后"); return result; } }
3、测试类
import com.it.service.Subject; import com.it.service.impl.InvocationHandlerImpl; import com.it.service.impl.RealSubject; import java.lang.reflect.Proxy; public class DynamicProxyTest { public static void main(String [] args) { Subject realSubject = new RealSubject(); InvocationHandlerImpl invocationHandler = new InvocationHandlerImpl(realSubject); ClassLoader classLoader = realSubject.getClass().getClassLoader(); Class<?>[] interfaces = realSubject.getClass().getInterfaces(); Object object = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler); if (object instanceof Subject) { Subject subject = (Subject) object; String result = subject.sayHello(); System.out.println(result); } } }
//结果:
调用方法之前
调用方法之后
Hello