java反射机制的业务应用场景-1
2014-03-27 22:52
465 查看
好久不写东西,最近整理之前的东西时发现以前有一些写好的东西,其实都是一些学习笔记或是对某个技术理解的一些感想,觉得很有意思,拿出来和大家分享一下。
这篇文章我们先来说一下java的反射机制,java的反射机制其实在1.2的时候就已经有了,那时我们还没有机会使用呢!而且也未必有那样的场景需要使用,前几年遇到一个场景使用java的反射机制在适合不过了,所以就使用了一下,发现确实好使,于是就写了一些学习的笔记。
下面我们就聊一下java的反射机制吧。
首先介绍一下java的反射机制,java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
下面我们来具体说一个应用场景:分布式WebService接口设计
需求:只发布一个接口方法,实现多个业务操作。
看着这样的设计需求,其实有很多种实现方式,其它的我就不一一评述了,我们只说一下使用java反射机制配和axis配置WebService的实现方式。
设计思路:发布一个接口,该接口使用一个业务类实现,该业务类中有很多具体业务实现方法。
例如:保存、获取列表、修改、获取某个对象实体。(分布式系统完全采用WebService通信)
利用axis发布一个多参数的接口,一个参数是function,一个参数时para。其中function的值对应业务类中的方法名,para是该方法要使用的数据对象,采用json格式。
这样WebService接口实现类就可以轻松的通过反射机制选择业务实现类的某个方法来实现逻辑处理。
代码实现:
axis配置多参数
接口类代码实现:
这样的设计有以下几个优点:
1:接口灵活可配。
2:判断业务方法简单高效,尤其是配置spring的依赖注入,完全可以高效的定位业务处理方法。
3:代码清晰简洁。
以上只是个人愚见欢迎大家批评指正。
注:WebService调用代码示例:
这篇文章我们先来说一下java的反射机制,java的反射机制其实在1.2的时候就已经有了,那时我们还没有机会使用呢!而且也未必有那样的场景需要使用,前几年遇到一个场景使用java的反射机制在适合不过了,所以就使用了一下,发现确实好使,于是就写了一些学习的笔记。
下面我们就聊一下java的反射机制吧。
首先介绍一下java的反射机制,java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
下面我们来具体说一个应用场景:分布式WebService接口设计
需求:只发布一个接口方法,实现多个业务操作。
看着这样的设计需求,其实有很多种实现方式,其它的我就不一一评述了,我们只说一下使用java反射机制配和axis配置WebService的实现方式。
设计思路:发布一个接口,该接口使用一个业务类实现,该业务类中有很多具体业务实现方法。
例如:保存、获取列表、修改、获取某个对象实体。(分布式系统完全采用WebService通信)
利用axis发布一个多参数的接口,一个参数是function,一个参数时para。其中function的值对应业务类中的方法名,para是该方法要使用的数据对象,采用json格式。
这样WebService接口实现类就可以轻松的通过反射机制选择业务实现类的某个方法来实现逻辑处理。
代码实现:
axis配置多参数
<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java" > <globalConfiguration> <parameter name="adminPassword" value="admin"/> <parameter name="attachments.Directory" value="./attachments"/> <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/> <parameter name="sendXsiTypes" value="true"/> <parameter name="sendMultiRefs" value="true"/> <parameter name="sendXMLDeclaration" value="true"/> <parameter name="axis.sendMinimizedElements" value="true"/> <parameter name="disablePrettyXML" value="true" /> <parameter name="dotNetSoapEncFix" value="true" /> <parameter name="enableNamespacePrefixOptimization" value="false" /> <requestFlow> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="session"/> </handler> <handler type="java:org.apache.axis.handlers.JWSHandler"> <parameter name="scope" value="request"/> <parameter name="extension" value=".jwr"/> </handler> </requestFlow> </globalConfiguration> <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/> <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/> <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/> <service name="UBSAService" type="" regenerateElement="true" provider="java:RPC" style="rpc" use="encoded" validate="true"> <parameter name="scope" value="Request" regenerateElement="false"/> <parameter name="allowedMethods" value="operateActivite"/> <parameter name="className" value="com.test.interf.webservice.ServiceImpl"/> <operation name="operateActivite" qname="operNS:operateActivite" xmlns:operNS="operateActivite" returnType="rns:string" xmlns:rns="http://www.w3.org/2001/XMLSchema"> <parameter name="function" type="ns:string" xmlns:ns="http://www.w3.org/2001/XMLSchema"/> <parameter name="para" type="ns:string" xmlns:ns="http://www.w3.org/2001/XMLSchema"/> </operation> </service> <transport name="http"> <requestFlow> <handler type="URLMapper"/> <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/> </requestFlow> <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler" /> <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler" /> <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler" /> </transport> <transport name="local"> <responseFlow> <handler type="LocalResponder"/> </responseFlow> </transport> </deployment> |
logger.info("请求参数[function]:"+function); logger.info("请求参数[para]:"+para); String responseData = ""; String result = ""; UBSActiviteWebBusiness ubsActiviteWebBusiness = (UBSActiviteWebBusiness) CustomBeanFactory.getBean("ubsActiviteWebBusiness"); WebResponseJosn res = new WebResponseJosn(); try { Class<? extends UBSActiviteWebBusiness> ubsActivite = ubsActiviteWebBusiness.getClass(); Method method = ubsActivite .getMethod(function, new Class[]{String.class}); if(method!=null){ result = (String) method.invoke(ubsActiviteWebBusiness, new Object[]{para}); }else{ res.setCode("1"); res.setMessage("未找到处理方法!"); } } catch (SecurityException e) { e.printStackTrace(); res.setCode("1"); res.setMessage("运营平台处理错误[SecurityException]"); } |
1:接口灵活可配。
2:判断业务方法简单高效,尤其是配置spring的依赖注入,完全可以高效的定位业务处理方法。
3:代码清晰简洁。
以上只是个人愚见欢迎大家批评指正。
注:WebService调用代码示例:
public static void main(String[] args) { String urlString = "http://127.0.0.1:8096/services/UBSAService?wsdl"; String nameSpaceUri = urlString.substring(0, urlString.length() - 5); String xml ="{\"productId\":\"123333\",\"aaaa\":\"aaaaaiiii\"}"; URL serviceWsdlUrl; Service service = new Service(); Call call; try { serviceWsdlUrl = new URL(urlString); call = (Call) service.createCall(); call.setTargetEndpointAddress(serviceWsdlUrl); call.setOperationName(new QName(nameSpaceUri, "operateActivite")); call.addParameter("function", XMLType.XSD_STRING, ParameterMode.IN); call.addParameter("para", XMLType.XSD_STRING, ParameterMode.IN); call.setReturnType(XMLType.XSD_STRING); String result = (String) call.invoke(new Object[] {"saveActivite",xml}); System.out.println(result); } catch (ServiceException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
相关文章推荐
- Redis常见业务场景应用
- Greenplum roaring bitmap与业务场景 (类阿里云RDS PG varbitx, 应用于海量用户 实时画像和圈选、透视)
- AOP这些应用场景(交叉业务)
- 触发器应用场景一: 根据业务逻辑限制某些操作__触发器应用场景二: 校验数据
- java反射机制应用场景
- lua+redis业务场景举例——队列中的应用
- Vue 生命周期详细解释及业务场景应用
- JAVA反射机制的应用场景(注:菜鸟勿喷~~)
- java反射机制应用场景
- 数据库的读锁和写锁在业务上的应用场景总结
- Java基础学习总结(75)——Java反射机制及应用场景
- JAVA反射机制的应用场景(注:菜鸟勿喷~~)
- 外键是否采用看业务应用场景,以及开发成本
- 结合实际业务场景聊一聊MVP模式的应用
- Java基础学习总结(75)——Java反射机制及应用场景
- Redis分布式锁在业务场景中的应用
- JAVA反射机制及应用场景
- SDN应用场景实践--指定业务带宽保障
- Redis各种数据结构介绍以及相应的业务场景应用
- JAVA反射机制的应用场景