Java中反射动态代理接口的详解及实例

 更新时间:2017年04月10日 11:16:15   投稿:lqh  
这篇文章主要介绍了Java中反射动态代理接口的详解及实例的相关资料,需要的朋友可以参考下

Java语言中反射动态代理接口的解释与演示

Java在JDK1.3的时候引入了动态代理机制、可以运用在框架编程与平台编程时候捕获事件、审核数据、日志等功能实现,首先看一下设计模式的UML图解:

当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现。

在Java中动态代理实现的两个关键接口类与class类分别如下:

java.lang.reflect.Proxy

java.lang.reflect.InvocationHandler

我们下面就通过InvocationHandler接口来实现动态代理过程,通过Proxy接口创建

一个代理类,然后测试完整的程序。要实现演示Demo需要如下几步:

一:首先定义我们自己的POJO对象接口类IExample与IUser

package com.example.pojo; 
 
public interface IExample { 
   
  public void setName(String name); 
   
  public String getName(); 
   
  public void setDesc(String description); 
   
  public String getDesc(); 
   
} 


package com.example.pojo; 
 
public interface IUser { 
   
  public void setUserID(String userID); 
   
  public String getUserID(); 
   
  public void setUserName(String userName); 
   
  public String getUserName(); 
 
} 

二:实现我们自己InvocationHandler接口,其中map我用来存储POJO对象的数据,这样做的好处是POJO接口无需再创建实现类,只有定义接口就可以通过代理直接使用该类,这在实际项目开发中非常有用。

package com.example.reflection; 
 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 
import java.util.HashMap; 
import java.util.Map; 
 
public class MyProxyView implements InvocationHandler { 
  private Map<Object, Object> map = null; 
 
  public static Object newInstance(Class[] interfaces) { 
    return Proxy.newProxyInstance(MyProxyView.class.getClassLoader(), 
        interfaces, new MyProxyView()); 
  } 
 
  private MyProxyView() { 
    this.map = new HashMap<Object, Object>(); 
  } 
 
  @Override 
  public Object invoke(Object proxy, Method method, Object[] args) 
      throws Throwable { 
    Object result = null; 
    String methodName = method.getName(); 
    if (methodName.startsWith("get")) { 
      String name = methodName.substring(methodName.indexOf("get") + 3); 
      return map.get(name); 
    } else if (methodName.startsWith("set")) { 
      String name = methodName.substring(methodName.indexOf("set") + 3); 
      map.put(name, args[0]); 
      return null; 
    } else if (methodName.startsWith("is")) { 
      String name = methodName.substring(methodName.indexOf("is") + 2); 
      return (map.get(name)); 
    } 
    return result; 
  } 
 
} 

三:通过Proxy方法初始化代理得到POJO对象,运行与测试:

package com.example.reflection; 
 
import com.example.pojo.IExample; 
import com.example.pojo.IUser; 
 
public class TextProxy { 
   
  public static void main(String[] args) 
  { 
    IExample example = (IExample)MyProxyView.newInstance(new Class[]{IExample.class}); 
     
    IUser user = (IUser)MyProxyView.newInstance(new Class[]{IUser.class}); 
     
    // aduit bean 1 
    example.setName("my example"); 
    example.setDesc("my proxy example"); 
    // aduit bean 2 
    user.setUserID("jia20003"); 
    user.setUserName("gloomyfish"); 
     
    System.out.println("exmaple name : " + example.getName()); 
    System.out.println("exmaple desc : " + example.getDesc()); 
    System.out.println(); 
    System.out.println("user ID : " + user.getUserID()); 
    System.out.println("user name : " + user.getUserName()); 
  } 
 
} 

四:运行结果如下:

exmaple name : my example 
exmaple desc : my proxy example 
 
user ID : jia20003 
user name : gloomyfish 

Java动态代理方式对框架编程非常重要无论是在Web端还是桌面端

而真正把这种技术发扬光大的则是spring框架。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • mybatis动态新增(insert)和修改(update)方式

    mybatis动态新增(insert)和修改(update)方式

    这篇文章主要介绍了mybatis动态新增(insert)和修改(update)方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot访问windows共享文件的方法

    SpringBoot访问windows共享文件的方法

    这篇文章主要介绍了SpringBoot访问windows共享文件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用windows共享功能进行文件传输,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Mybatis-Plus雪花id的使用以及解析机器ID和数据标识ID实现

    Mybatis-Plus雪花id的使用以及解析机器ID和数据标识ID实现

    这篇文章主要介绍了Mybatis-Plus雪花id的使用以及解析机器ID和数据标识ID实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Spring BeanUtils忽略空值拷贝的方法示例代码

    Spring BeanUtils忽略空值拷贝的方法示例代码

    本文用示例介绍Spring(SpringBoot)如何使用BeanUtils拷贝对象属性忽略空置,忽略null值拷贝属性的用法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-03-03
  • Java设计模式详解之门面模式(外观模式)

    Java设计模式详解之门面模式(外观模式)

    为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。本文给大家介绍Java设计模式详解之门面模式(外观模式),感兴趣的朋友参考下吧
    2016-04-04
  • Java设计模式之享元模式示例详解

    Java设计模式之享元模式示例详解

    享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实现方式。本文将通过示例详细讲解享元模式,感兴趣的可以了解一下
    2022-03-03
  • java控制台输出百分比进度条示例

    java控制台输出百分比进度条示例

    这篇文章主要介绍了java控制台输出百分比进度条示例,需要的朋友可以参考下
    2014-04-04
  • 详解Spring AOP 实现主从读写分离

    详解Spring AOP 实现主从读写分离

    本篇文章主要介绍了Spring AOP 实现主从读写分离,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java并发编程之Semaphore详解

    Java并发编程之Semaphore详解

    这篇文章主要介绍了Java并发编程之concurrent包中的Semaphore详解,信号量Semaphore一般用来表示可用资源的个数,相当于一个计数器,可类比生活中停车场牌子上面显示的停车场剩余车位数量,需要的朋友可以参考下
    2023-12-12
  • java实现微信小程序加密数据解密算法

    java实现微信小程序加密数据解密算法

    这篇文章主要为大家详细介绍了java实现微信小程序加密数据解密算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09

最新评论