定义接口和目标对象
/** * 参考人员接口 * * @author Silence * */ public interface Candidate { /** * 答题 */ public void answerTheQuestions(); }
/** * 懒学生 * * @author Silence * */ public class LazyStudent implements Candidate { private String name; public LazyStudent(String name) { super(); this.name = name; } @Override public void answerTheQuestions() { // 懒学生只能写出自己的名字不会答题 System.out.println("姓名:" + name); } }
静态代理
/** * 静态代理,也要实现接口,不利于代码维护 * * @author Silence * */ public class Gunman implements Candidate { private Candidate target; // 被代理对象 public Gunman(Candidate target) { this.target = target; } @Override public void answerTheQuestions() { // 枪手要写上代考的学生的姓名 target.answerTheQuestions(); // 枪手要帮助懒学生答题并交卷 System.out.println("奋笔疾书正确答案"); System.out.println("交卷"); } }
@Test public void ProxTest1() { Candidate candidate = new Gunman(new LazyStudent("王小二")); candidate.answerTheQuestions(); }

动态代理---不需要实现接口,推荐使用
public class ProxyFactory { private Candidate target; public ProxyFactory(Candidate target) { this.target = target; } public Object getProxyInstance() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 执行目标对象的方法 Object retVal = method.invoke(target, args); System.out.println("奋笔疾书正确答案。。。。。"); System.out.println("交卷"); return retVal; } }); } }
@Test public void ProxyTest2(){ // 目标 对象 Candidate target = new LazyStudent("明明"); // 原始的类型 System.out.println(target.getClass()); // 给目标对象创建代理对象 Candidate proxy = (Candidate) new ProxyFactory(target).getProxyInstance(); // 内存中动态生成的代理对象 System.out.println(proxy.getClass()); // 执行方法 【代理对象】 proxy.answerTheQuestions(); } }
