这篇文章将为大家详细讲解有关如何在Java怎么中创建一个动态接口,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1, mybatis/jpa等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现。
2,达博等分布式服务框架,消费者只需要引入接口就可以调用远程的实现,分析源代码,其实在消费端产生了接口的代理实现,再由代理调用远程接口。
3, spring aop这是最典型的动态代理了。
创建接口的动态实现,有二种最常用的方式:JDK动态代理和CGLIB动态代理。
代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。
代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(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 ()); } }
在这段测试代码中,并没有接口的任何实现,大家猜猜会是什么结果?
控制台打印:
说明接口在调用时,把实现委托给了代理,最后具体要做的就是这个代理里面的处理:
在上面这段代码当中,可以看的出,拿到了接口的方法以及参数,那么就可以做很多的事情,如根据方法名或者配合方法上面的注解来实现比较丰富的功能。
一个简单的例子只是用来说明这个原理,下面再举一个远程接口动态调用的例子来加深理解。
1,创建代理类和目标类需要实现共同的接口服务
包com.markliu.remote.service;/* * *服务接口。代理类和被代理类抖需要实现该接口 */公共接口服务{ 公共字符串getService(字符串名称,int数); }
2,服务器端创建RemoteService类,实现了服务接口。
包com.markliu.remote.serviceimpl; 进口com.markliu.remote.service.Service;/* * *服务器端目标业务类,被代理对象 */公共类RemoteService实现服务{ @Override 公共字符串getService(字符串名称,int) { 返回名称+“:“+数量; } }如何在Java怎么中创建一个动态接口