欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-01 08:30:58
java语言中反射动态代理接口的解释与演示 java在jdk1.3的时候引入了动态代理机制、可以运用在框架编程与平台编程时候捕获事件、审核数据、日志等功能实现,首先看一下...

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

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

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

当你调用一个接口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框架。

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