JDK动态代理,动态生成代理类。
Posted 花l信风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK动态代理,动态生成代理类。相关的知识,希望对你有一定的参考价值。
1.动态代理涉及到的类
(1) Java.lang.reflect.Proxy类,作用:动态生成代理类和对象
(2) Java.lang.reflect.InvocationHandler(处理器接口)
可以通过invoke方法实现对真实角色的代理访问,每次通过Proxy生成代理类对象时都要指定处理器对象。
package com.xvl.proxy; /** * 接口:明星接口 * @author 1 * */ public interface Star { //面谈 void confer(); //订票 void bookTicket(); //唱歌 void sing(); //收尾款 void collectMoney(); }
1 package com.xvl.proxy; 2 /** 3 * 真实类:真实明星 4 * @author 1 5 * 6 */ 7 public class RealStar implements Star { 8 9 @Override 10 public void confer() { 11 System.out.println("真实角色面谈..."); 12 } 13 14 @Override 15 public void bookTicket() { 16 System.out.println("真实角色订票..."); 17 } 18 19 @Override 20 public void sing() { 21 System.out.println("真实角色唱歌..."); 22 } 23 24 @Override 25 public void collectMoney() { 26 System.out.println("真实角色收尾款..."); 27 } 28 29 }
1 package com.xvl.proxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class StarHandler implements InvocationHandler { 7 8 Star realstar; 9 10 public StarHandler(Star realstar) { 11 this.realstar = realstar; 12 } 13 14 /** 15 * 在invoke方法中实现对真实角色的控制 16 */ 17 @Override 18 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 19 System.out.println("********"); 20 method.invoke(realstar, args); 21 return null; 22 } 23 24 }
1 package com.xvl.proxy; 2 3 import java.lang.reflect.Proxy; 4 5 /** 6 * 测试类 7 * @author 1 8 * 9 */ 10 public class Test { 11 public static void main(String[] args) { 12 Star star = new RealStar(); 13 StarHandler starHandler = new StarHandler(star); 14 //创建代理类对象,newProxyInstance返回一个实现star接口的代理类对象 15 Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, starHandler); 16 /* 17 * 此时便可以通过代理类操作 18 */ 19 proxy.bookTicket(); //代理对象调用方法会调用真实对象的方法 20 proxy.confer(); //代理对象调用方法会调用真实对象的方法 21 proxy.sing(); //代理对象调用方法会调用真实对象的方法 22 proxy.collectMoney(); //代理对象调用方法会调用真实对象的方法 23 } 24 }
运行结果如下:↓
********
真实角色订票...
********
真实角色面谈...
********
真实角色唱歌...
********
真实角色收尾款...
在invoke方法中实现对真实角色的控制 假如将invoke方法修改如下
1 package com.xvl.proxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class StarHandler implements InvocationHandler { 7 8 Star realstar; 9 10 public StarHandler(Star realstar) { 11 this.realstar = realstar; 12 } 13 14 /** 15 * 在invoke方法中实现对真实角色的控制 16 */ 17 @Override 18 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 19 Object object = null ; 20 System.out.println("********"); 21 if(method.getName().equals("sing")){ 22 object = method.invoke(realstar, args); 23 } 24 return object; 25 } 26 27 }
输出结果如下:
********
********
********
真实角色唱歌...
********
invoke方法如何被调用不太清楚,正在探索中....
本人初学,如有错误,望指正。
以上是关于JDK动态代理,动态生成代理类。的主要内容,如果未能解决你的问题,请参考以下文章