Java - 动态创建子类 [英] Java - creating a subclass dynamically

查看:102
本文介绍了Java - 动态创建子类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想以编程方式创建一个子类.我想我几乎没有选择 - Javassist、CGLib、BCEL 或 ASM.

I'd like to create a subclass programatically. I guess I have few options - Javassist, CGLib, BCEL, or ASM.

用例是一个应用程序的内部是面向类的,而扩展是基于类的.因此,我不能将单个类作为由外部化脚本驱动的多个扩展的基础.

The use case is that one app's internals are class-oriented, and extensions are class-based. Therefore I can't have a single class as a base for multiple extensions driven by externalized scripts.

现在 - 我该怎么做?我找到了拦截​​方法调用、字段访问、初始化等的例子.但没有关于子类化.

Now - how would I do that? I've found examples with intercepting method calls, field access, initialization etc. But nothing about subclassing.

我想以这样的课程结束:

I'd like to end up with a class which:

  • 有一个我想要的名字.
  • 是给定类的(直接,最多)子类
  • 从父类复制构造函数(或调用super(...))
  • 最后,我想给它一些注释.

我知道这是可能的,因为各种动态语言集成,例如 GroovyClassLoader,都可以做到这一点.

I know it's possible because various dynamic languages integrations, like GroovyClassLoader, can do that.

推荐答案

Javassist 很容易:

It's quite easy with Javassist:

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;

static Class<? extends DefinitionBasedMigrator> createClass( String fullName )
        throws NotFoundException, CannotCompileException
{
    ClassPool pool = ClassPool.getDefault();

    // Create the class.
    CtClass subClass = pool.makeClass( fullName );
    final CtClass superClass = pool.get( DefinitionBasedMigrator.class.getName() );
    subClass.setSuperclass( superClass );
    subClass.setModifiers( Modifier.PUBLIC );

    // Add a constructor which will call super( ... );
    CtClass[] params = new CtClass[]{
        pool.get( MigratorDefinition.class.getName() ),
        pool.get( GlobalConfiguration.class.getName()) 
    };
    final CtConstructor ctor = CtNewConstructor.make( params, null, CtNewConstructor.PASS_PARAMS, null, null, subClass );
    subClass.addConstructor( ctor );

    return subClass.toClass();
}

Maven 依赖:

<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.22.0-GA</version>
</dependency>

这篇关于Java - 动态创建子类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆