static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h )
注意該方法在 Proxy 類中是靜態方法,且接收的三個引數說明依次為:public interface IPerson { void findTeacher(); //找老師 }兒子張三要找老師,實現 IPerson 介面,ZhangSan 類程式碼如下:
public class ZhangSan implements IPerson { @Override public void findTeacher() { System.out.println("兒子張三提出要求"); } }父親張老三要幫兒子張三找老師,實現 IPerson 介面,ZhangLaoSan 類程式碼如下:
public class ZhangLaoSan implements IPerson { private ZhangSan zhangsan; public ZhangLaoSan(ZhangSan zhangsan) { this.zhangsan = zhangsan; } @Override public void findTeacher() { System.out.println("張老三開始找老師"); zhangsan.findTeacher(); System.out.println("開始學習"); } }新建 Test 類測試程式碼。
public class Test { public static void main(String[] args) { ZhangLaoSan zhanglaosan = new ZhangLaoSan(new ZhangSan()); zhanglaosan.findTeacher(); } }執行結果如下所示:
張老三開始找老師
兒子張三提出要求
開始學習
public class JdkFuDao implements InvocationHandler { private IPerson target; public IPerson getInstance(IPerson target) { this.target = target; Class<?> clazz = target.getClass(); return (IPerson) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object result = method.invoke(this.target, args); after(); return result; } private void after() { System.out.println("雙方同意,開始輔導"); } private void before() { System.out.println("這裡是C語言中文網輔導班,已經收集到您的需求,開始挑選老師"); } }然後建立一個類 ZhaoLiu。
public class ZhaoLiu implements IPerson { @Override public void findTeacher() { System.out.println("符合趙六的要求"); } public void buyInsure() { } }需要注意的是,代理物件不需要實現介面,但是目標物件一定要實現介面,否則不能用動態代理。
public class Test { public static void main(String[] args) { JdkFuDao jdkFuDao = new JdkFuDao(); IPerson zhaoliu = jdkFuDao.getInstance(new ZhaoLiu()); zhaoliu.findTeacher(); } }執行結果如下所示:
這裡是C語言中文網輔導班,已經收集到您的需求,開始挑選老師
符合趙六的要求
雙方同意,開始輔導