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动态代理,动态生成代理类。的主要内容,如果未能解决你的问题,请参考以下文章

JDK动态代理,动态生成代理类。

动态代理

(java反射-JDK动态代理)+CGLIB动态代理

类的加载机制和反射——使用反射生成JDK动态代理

JDK / CGLIB 动态代理

动态代理:JDK动态代理和CGLIB代理的区别