如何在Java怎么中创建一个动态接口

  介绍

这篇文章将为大家详细讲解有关如何在Java怎么中创建一个动态接口,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1, mybatis/jpa等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现。

2,达博等分布式服务框架,消费者只需要引入接口就可以调用远程的实现,分析源代码,其实在消费端产生了接口的代理实现,再由代理调用远程接口。

3, spring aop这是最典型的动态代理了。

创建接口的动态实现,有二种最常用的方式:JDK动态代理和CGLIB动态代理。

代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。

代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

如何在Java怎么中创建一个动态接口

通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(spring的aop机制),设计上获得更大的灵活性。

下面用JDK动态代理加一点简单的代码来演示这个过程:

1,接口

包com.yhouse.modules.daos;
  
  公共接口IUserDao {
  公共字符串getUserName ();
  }

2,创建代理

包com.yhouse.modules.daos;
  
  进口java.lang.reflect.Proxy;/* *
  *创建代理
  * @author clonen.cheng
  *
  */公共类调用程序{
  
  
  公共对象getInstance (Class<及# 63;比;cls) {
  MethodProxy invocationHandler=new MethodProxy ();
  对象newProxyInstance=Proxy.newProxyInstance (
  cls.getClassLoader (),
  新类[]{cls},
  invocationHandler);
  返回newProxyInstance(对象);
  }
  }

3,运行时调用接口的方法时的实现(这一过程也称为接口的方法实现)

包com.yhouse.modules.daos;
  
  进口java.lang.reflect.InvocationHandler;
  进口java.lang.reflect.Method;
  
  公共类MethodProxy实现InvocationHandler {
  
  @Override
  公共对象调用对象代理、方法方法,对象[]args)抛出Throwable {//如果传进来是一个已实现的具体类(本次演示略过此逻辑)
  如果(Object.class.equals (method.getDeclaringClass ())) {
  尝试{
  方法返回。调用(这一点,args);
  }捕捉(Throwable t) {
  t.printStackTrace ();
  }//如果传进来的是一个接口(核心)
  其他}{
  返回运行(方法,args);
  }
  返回null;
  }/* *
  *实现接口的核心方法
  * @param方法
  * @param arg游戏
  * @return
  */公共对象运行(方法方法,对象[]args) {//TODO//如远程http调用//如远程方法调用(rmi)//....
  返回“方法调用成功!“;
  }
  
  }

4,测试

包com.yhouse.modules.daos;
  
  公开课ProxyTest {
  
  
  公共静态void main (String [] args) {
  IUserDao调用程序=(IUserDao)新的调用程序().getInstance (IUserDao.class);
  System.out.println (invoker.getUserName ());
  }
  
  }

在这段测试代码中,并没有接口的任何实现,大家猜猜会是什么结果?

控制台打印:

如何在Java怎么中创建一个动态接口

说明接口在调用时,把实现委托给了代理,最后具体要做的就是这个代理里面的处理:

如何在Java怎么中创建一个动态接口

在上面这段代码当中,可以看的出,拿到了接口的方法以及参数,那么就可以做很多的事情,如根据方法名或者配合方法上面的注解来实现比较丰富的功能。

一个简单的例子只是用来说明这个原理,下面再举一个远程接口动态调用的例子来加深理解。

1,创建代理类和目标类需要实现共同的接口服务

包com.markliu.remote.service;/* *
  *服务接口。代理类和被代理类抖需要实现该接口
  */公共接口服务{
  公共字符串getService(字符串名称,int数);
  }

2,服务器端创建RemoteService类,实现了服务接口。

包com.markliu.remote.serviceimpl;
  进口com.markliu.remote.service.Service;/* *
  *服务器端目标业务类,被代理对象
  */公共类RemoteService实现服务{
  @Override
  公共字符串getService(字符串名称,int) {
  返回名称+“:“+数量;
  }
  }

如何在Java怎么中创建一个动态接口