java反射机制与动态代理

本文介绍了Java反射机制的基础,包括Class类与相关API的使用,以及如何利用反射机制实现动态代理。通过具体代码示例展示了动态代理的工作原理,并探讨了其在实际应用中的价值。

java反射机制与动态代理

1 java反射机制:运行时的类信息

Class类与java.lang.reflect类库一起对反射概念进行了支持,该类库包含了Field,Method以及Constructor类。这些类型的对象是由JVM在运行时创建的,用以表示未知类里对应的成员。这样就可以使用Constructor创建新的对象,用get()与set()方法读取与修改与Field对象相关的字段,用invoke()方法调用与Method对象相关的方法等等。

 

2 动态代理:

代理模式:为了提供额外的或不同的操作,而插入的用来代替“实际”对象。这些操作通常涉及与“实际”对象的通讯,因此代理通常充当着中间人的角色。

动态代理:所有的调用都会被重定向到单一的调用处理器上,他的工作是揭示调用的类型并确定相应的对策。

java反射机制实现动态代理的源码:

Java代码 
  1. interface Interface {  
  2.   void doSomething();  
  3.   void somethingElse(String arg);  
  4. }  
  5.   
  6. class RealObject implements Interface {  
  7.   public void doSomething() { print("doSomething"); }  
  8.   public void somethingElse(String arg) {  
  9.     print("somethingElse " + arg);  
  10.   }  
  11. }  

 

 

Java代码 
  1. import java.lang.reflect.*;  
  2.   
  3. class DynamicProxyHandler implements InvocationHandler {  
  4.     private Object proxied;  
  5.   
  6.     public DynamicProxyHandler(Object proxied) {  
  7.         this.proxied = proxied;  
  8.     }  
  9.   
  10.     public Object invoke(Object proxy, Method method, Object[] args)  
  11.             throws Throwable {  
  12.         System.out.println("**** proxy: " + proxy.getClass() + ", method: "  
  13.                 + method + ", args: " + args);  
  14.         if (args != null)  
  15.             for (Object arg : args)  
  16.                 System.out.println("  " + arg);  
  17.         return method.invoke(proxied, args);  
  18.     }  
  19. }  
  20.   
  21. public class SimpleDynamicProxy {  
  22.     public static void consumer(Interface iface) {  
  23.         iface.doSomething();  
  24.         iface.somethingElse("bonobo");  
  25.     }  
  26.   
  27.     public static void main(String[] args) {  
  28.         RealObject real = new RealObject();  
  29.         consumer(real);  
  30.         // Insert a proxy and call again:  
  31.         Interface proxy = (Interface) Proxy.newProxyInstance(Interface.class  
  32.                 .getClassLoader(), new Class[] { Interface.class },  
  33.                 new DynamicProxyHandler(real));  
  34.         consumer(proxy);  
  35.     }  
  36. }  

 当我们查看java.lang.reflect.Proxy源码,我们发现起核心作用的是ProxyGenerator.generateProxyClass(String paramString, Class[] paramArrayOfClass),最令人疑惑的问题是,代理对象和如何调用DynamicProxyHandler的invoke方法的,从源码里面我们很难发现如何处理的,对于ProxyGenerator写了一个测试类ProxyClassFile

Java代码 
  1. import java.io.File;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5.   
  6. import sun.misc.ProxyGenerator;  
  7.   
  8. public class ProxyClassFile {  
  9.   
  10.     public static void main(String[] args) {  
  11.   
  12.         String proxyName = "SimpleDynamicProxy";  
  13.   
  14.         RealObject t = new RealObject();  
  15.   
  16.         Class[] interfaces = t.getClass().getInterfaces();  
  17.   
  18.         byte[] proxyClassFile = ProxyGenerator.generateProxyClass(  
  19.   
  20.         proxyName, interfaces);  
  21.   
  22.         File f = new File("E:/workspace/TIJ4/bin/typeinfo/SimpleDynamicProxy.class");  
  23.   
  24.         try {  
  25.   
  26.             FileOutputStream fos = new FileOutputStream(f);  
  27.   
  28.             fos.write(proxyClassFile);  
  29.   
  30.             fos.flush();  
  31.   
  32.             fos.close();  
  33.   
  34.         } catch (FileNotFoundException e) {  
  35.   
  36.             e.printStackTrace(); // To change body of catch statement use File |  
  37.                                     // Settings | File Templates.  
  38.   
  39.         } catch (IOException e) {  
  40.   
  41.             e.printStackTrace(); // To change body of catch statement use File |  
  42.                                     // Settings | File Templates.  
  43.   
  44.         }  
  45.   
  46.     }  
  47.   
  48. }  

 

反编译SimpleDynamicProxy.class,代码初看起来有点复杂,仔细观察还是很有规律的,将SimpleDynamicProxy5个方法都重定向到invoke()方法,equals(),hashCode()和toString()都是父类Object方法,doSomething()和somethingElse()为接口方法。

Java代码 
  1. import java.lang.reflect.InvocationHandler;  
  2. import java.lang.reflect.Method;  
  3. import java.lang.reflect.Proxy;  
  4. import java.lang.reflect.UndeclaredThrowableException;  
  5. import typeinfo.Interface;  
  6.   
  7. public final class SimpleDynamicProxy extends Proxy  
  8.   implements Interface  
  9. {  
  10.   private static Method m1;  
  11.   private static Method m0;  
  12.   private static Method m3;  
  13.   private static Method m4;  
  14.   private static Method m2;  
  15.   
  16.   public SimpleDynamicProxy(InvocationHandler paramInvocationHandler)  
  17.     throws   
  18.   {  
  19.     super(paramInvocationHandler);  
  20.   }  
  21.   
  22.   public final boolean equals(Object paramObject)  
  23.     throws   
  24.   {  
  25.     try  
  26.     {  
  27.       return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();  
  28.     }  
  29.     catch (RuntimeException localRuntimeException)  
  30.     {  
  31.       throw localRuntimeException;  
  32.     }  
  33.     catch (Throwable localThrowable)  
计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略研究(Matlab代码实现)内容概要:本文研究了计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略,并提供了基于Matlab的代码实现。研究聚焦于在高渗透率可再生能源接入背景下,如何协调微电网内部分布式电源、储能系统大规模电动汽车充电负荷之间的互动关系,通过引入需求侧响应机制,建立多目标优化调度模型,实现系统运行成本最小化、可再生能源消纳最大化以及电网负荷曲线的削峰填谷。文中详细阐述了风电出力不确定性处理、电动汽车集群充放电行为建模、电价型激励型需求响应机制设计以及优化求解算法的应用。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、微电网、电动汽车等领域技术研发的工程师。; 使用场景及目标:①用于复现相关硕士论文研究成果,深入理解含高比例风电的微电网优化调度建模方法;②为开展电动汽车参电网互动(V2G)、需求侧响应等课题提供仿真平台和技术参考;③适用于电力系统优化、能源互联网、综合能源系统等相关领域的教学科研项目开发。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注模型构建逻辑算法实现细节,同时可参考文档中提及的其他相关案例(如储能优化、负荷预测等),以拓宽研究视野并促进交叉创新。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值