设计一个对接系统,通过动态模型的增删改触发业务系统相应服务的调用。模型增删改方法动态发布为WebService服务。WebService服务采用CXF发布,动态类生成采用Javassist。由于WebService服务类需要添加WebService相关注解,而国内关于Javassist生成包含注解的动态类介绍少之又少,于是花费一下午研究Javassist接口,终于让我找到了办法。

类注解和方法注解生成流程:

1、 创建注解Annotation;

2、 注解队列AnnotationsAttribute添加注解Annotation;

3、 类ClassFile或方法信息CtMethod.getMethodInfo()添加注解队列AnnotationsAttribute。

参数注解生成流程:

1、 创建注解二维数组Annotation[][]:第一维对应参数序列,第二维对应注解序列;

2、 参数注解属性ParameterAnnotationsAttribute添加注解二维数组Annotation[][];

3、 方法信息CtMethod.getMethodInfo()添加参数注解属性ParameterAnnotationsAttribute。

一、动态WebService服务生成类。

  1. package com.coshaho.learn.javassist;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5.  
  6. import javassist.ClassPool;
  7. import javassist.CtClass;
  8. import javassist.CtMethod;
  9. import javassist.Modifier;
  10. import javassist.bytecode.AnnotationsAttribute;
  11. import javassist.bytecode.ClassFile;
  12. import javassist.bytecode.ConstPool;
  13. import javassist.bytecode.ParameterAnnotationsAttribute;
  14. import javassist.bytecode.annotation.Annotation;
  15. import javassist.bytecode.annotation.StringMemberValue;
  16.  
  17. public class DynamicWebserviceGenerator
  18. {
  19. public Class<?> createDynamicClazz() throws Exception
  20. {
  21. ClassPool pool = ClassPool.getDefault();
  22.  
  23. // 创建类
  24. CtClass cc = pool.makeClass("com.coshaho.learn.DynamicHelloWorld");
  25.  
  26. // 创建方法
  27. CtClass ccStringType = pool.get("java.lang.String");
  28. // 参数: 1:返回类型 2:方法名称 3:传入参数类型 4:所属类CtClass
  29. CtMethod ctMethod=new CtMethod(ccStringType,"sayHello",new CtClass[]{ccStringType},cc);
  30. ctMethod.setModifiers(Modifier.PUBLIC);
  31. StringBuffer body=new StringBuffer();
  32. body.append("{");
  33. body.append("\n System.out.println($1);");
  34. body.append("\n return \"Hello, \" + $1;");
  35. body.append("\n}");
  36. ctMethod.setBody(body.toString());
  37. cc.addMethod(ctMethod);
  38.  
  39. ClassFile ccFile = cc.getClassFile();
  40. ConstPool constPool = ccFile.getConstPool();
  41.  
  42. // 添加类注解
  43. AnnotationsAttribute bodyAttr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
  44. Annotation bodyAnnot = new Annotation("javax.jws.WebService", constPool);
  45. bodyAnnot.addMemberValue("name", new StringMemberValue("HelloWoldService", constPool));
  46. bodyAttr.addAnnotation(bodyAnnot);
  47.  
  48. ccFile.addAttribute(bodyAttr);
  49.  
  50. // 添加方法注解
  51. AnnotationsAttribute methodAttr = new AnnotationsAttribute(constPool, AnnotationsAttribute.visibleTag);
  52. Annotation methodAnnot = new Annotation("javax.jws.WebMethod", constPool);
  53. methodAnnot.addMemberValue("operationName", new StringMemberValue("sayHelloWorld", constPool));
  54. methodAttr.addAnnotation(methodAnnot);
  55.  
  56. Annotation resultAnnot = new Annotation("javax.jws.WebResult", constPool);
  57. resultAnnot.addMemberValue("name", new StringMemberValue("result", constPool));
  58. methodAttr.addAnnotation(resultAnnot);
  59.  
  60. ctMethod.getMethodInfo().addAttribute(methodAttr);
  61.  
  62. // 添加参数注解
  63. ParameterAnnotationsAttribute parameterAtrribute = new ParameterAnnotationsAttribute(
  64. constPool, ParameterAnnotationsAttribute.visibleTag);
  65. Annotation paramAnnot = new Annotation("javax.jws.WebParam", constPool);
  66. paramAnnot.addMemberValue("name", new StringMemberValue("name",constPool));
  67. Annotation[][] paramArrays = new Annotation[1][1];
  68. paramArrays[0][0] = paramAnnot;
  69. parameterAtrribute.setAnnotations(paramArrays);
  70.  
  71. ctMethod.getMethodInfo().addAttribute(parameterAtrribute);
  72.  
  73. //把生成的class文件写入文件
  74. byte[] byteArr = cc.toBytecode();
  75. FileOutputStream fos = new FileOutputStream(new File("D://DynamicHelloWorld.class"));
  76. fos.write(byteArr);
  77. fos.close();
  78.  
  79. return cc.toClass();
  80. }
  81. }

二、动态WebService服务发布。

  1. package com.coshaho.learn.javassist;
  2.  
  3. import org.apache.cxf.endpoint.Server;
  4. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
  5.  
  6. public class DynamicWebServiceServer
  7. {
  8. public static void main(String[] args) throws Exception
  9. {
  10. DynamicWebserviceGenerator javassistLearn = new DynamicWebserviceGenerator();
  11. Class<?> webservice = javassistLearn.createDynamicClazz();
  12.  
  13. JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
  14.  
  15. // Web服务的地址
  16. factoryBean.setAddress("http://localhost:8081/dynamicHello");
  17.  
  18. // Web服务对象调用接口
  19. factoryBean.setServiceClass(webservice);
  20. Server server = factoryBean.create();
  21. server.start();
  22. }
  23. }

三、SoapUI测试。

注:反编译查看Javassist生成的动态类。

Javassist注解(Annotation)的使用:CXF WebService动态生成的更多相关文章

  1. SOA 下实现分布式 调用 cxf+ webService +动态调用

    近期项目间隙 自学了  webservice   一下 是我写的  一个demo 首先我们在web.xml 里配置如下 <servlet> <servlet-name>CXFS ...

  2. CXF WebService整合SpringMVC的maven项目

    首先推荐博客:http://www.cnblogs.com/xdp-gacl/p/4259481.html   http://blog.csdn.net/hu_shengyang/article/de ...

  3. Spring 3 整合Apache CXF WebService[转]

    http://www.cnblogs.com/hoojo/archive/2012/07/13/2590593.html 在CXF2版本中,整合Spring3发布CXF WebService就更加简单 ...

  4. (转)Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

    1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以 ...

  5. Spring对注解(Annotation)处理【转】

    1.从Spring2.0以后的版本中,spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以 ...

  6. java调用CXF WebService接口的两种方式

    通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 2.静态调用 // 创建WebService客户端代理工厂 ...

  7. Java学习之注解Annotation实现原理

    前言: 最近学习了EventBus.BufferKinfe.GreenDao.Retrofit 等优秀开源框架,它们新版本无一另外的都使用到了注解的方式,我们使用在使用的时候也尝到不少好处,基于这种想 ...

  8. Java注解Annotation学习

    学习注解Annotation的原理,这篇讲的不错:http://blog.csdn.net/lylwo317/article/details/52163304 先自定义一个运行时注解 @Target( ...

  9. CXF WebService 教程

    业务需求:常见WEB服务: 手机淘宝.京东…. 天气预报 手机号归属地 股票查询 发手机短消息 手机充值功能 中英文翻译 银行转账业务 公司的“进销存系统”在某商品缺货时自动给供应商下订单 ..... ...

随机推荐

  1. REM+SVG Sprite,web app案例

    REM+SVG Sprite,构建新时代web app <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&quo ...

  2. 搭建linux远程服务器和传输下载文件

    其实,将ubuntu系统设置为服务器很简单,只需要开启ssh服务就可以了.开启了ssh服务以后,其它电脑就可以通过ssh登录你的这台ubuntu服务器.SSH分客户端openssh-client和op ...

  3. ububtu下安装配置搜狗输入法

    安装搜狗输入法 for linux参考教程: http://blog.csdn.net/u013894834/article/details/60357071 安装后会遇到无法切换英文的问题,可以参考 ...

  4. HIT 2739 - The Chinese Postman Problem - [带权有向图上的中国邮路问题][最小费用最大流]

    题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2739 Time limit : 1 sec Memory limit : 64 M A Chinese ...

  5. 从经典面试题看java中类的加载机制

    1.概述 类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助. 由于Ja ...

  6. 用栈来递归 模板 honoi

    用栈来模拟递归的技巧 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> #include& ...

  7. Elasticsearch之settings和mappings的意义

    Elasticsearch之settings和mappings(图文详解)   Elasticsearch之settings和mappings的意义 简单的说,就是 settings是修改分片和副本数 ...

  8. Steady Cow Assignment---poj3189(多重匹配+二分)

    题目链接:http://poj.org/problem?id=3189 题意:有n头牛,B个牛棚,每头牛对牛棚都有一个喜欢度,接下来输入N*B的矩阵第i行第j列的数x表示:第i头牛第j喜欢的是x; 第 ...

  9. 优云软件助阵GOPS·2017全球运维大会北京站

    GOPS· 2017全球运维大会北京站于2017年7月28日-29日在北京隆重举办,汇聚国内一线运维专家和诸多运维同仁达800余名.作为长期致力于企业级高端运维市场软件开发和咨询服务的优云软件受邀参与 ...

  10. [转]基于S2SH框架的项目—antlr-2.7.2.jar包冲突问题

    java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I        org.hibernate.hql.ast.HqlSqlWal ...