成都网站建设设计

将想法与焦点和您一起共享

Java运行时动态生成类的方法-创新互联

创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、虚拟空间、营销软件、网站建设、海湖新网站维护、网站推广。

这篇文章主要介绍Java运行时动态生成类的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

  最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则。这就要求根据数据库数据动态生成对象处理特定规则的逻辑。如果手写不仅每次都要修改代码,还要每次测试发版,而且无法灵活根据用户定义的规则动态处理逻辑。所以想到将公共逻辑写到父类实现,将特定逻辑根据字符串动态生成子类处理。这就可以一劳永逸解决这个问题。

  那就着手从Java如何根据字符串模板在运行时动态生成对象。

  Java是一门静态语言,通常,我们需要的class在编译的时候就已经生成了,为什么有时候我们还想在运行时动态生成class呢?

  经过一番网上资料查找,由繁到简的方式总结如下:

一、利用JDK自带工具类实现

  现在问题来了,动态生成字节码,难度有多大?

  如果我们要自己直接输出二进制格式的字节码,在完成这个任务前,必须先认真阅读JVM规范第4章,详细了解class文件结构。估计读完规范后,两个月过去了。

  所以,第一种方法,自己动手,从零开始创建字节码,理论上可行,实际上很难。

  第二种方法,使用已有的一些能操作字节码的库,帮助我们创建class。

  目前,能够操作字节码的开源库主要有CGLib和Javassist两种,它们都提供了比较高级的API来操作字节码,最后输出为class文件。

比如CGLib,典型的用法如下:

Enhancer e = new Enhancer();
e.setSuperclass(...);
e.setStrategy(new DefaultGeneratorStrategy() {
  protected ClassGenerator transform(ClassGenerator cg) {
    return new TransformingGenerator(cg,
      new AddPropertyTransformer(new String[]{ "foo" },
          new Class[] { Integer.TYPE }));
  }});
Object obj = e.create();

当前题目:Java运行时动态生成类的方法-创新互联
文章网址:http://chengdu.cdxwcx.cn/article/csspii.html