10

プログラムでサブクラスを作成したいと思います。Javassist、CGLib、BCEL、または ASM など、選択肢はほとんどないと思います。

ユースケースは、1 つのアプリの内部がクラス指向であり、拡張機能がクラスベースであるというものです。したがって、外部化されたスクリプトによって駆動される複数の拡張機能のベースとして単一のクラスを持つことはできません。

今 - どうすればいいですか?メソッド呼び出し、フィールドアクセス、初期化などをインターセプトする例を見つけましたが、サブクラス化については何もありません。

私はクラスで終わりたいと思います:

  • 欲しい名前があります。
  • 与えられたクラスの(直接、せいぜい)サブクラスです
  • 親クラスからコンストラクターをコピーします (または呼び出しますsuper(...))
  • 最後に、いくつかの注釈を付けたいと思います。

などのさまざまな動的言語の統合がそれを可能にするため、それが可能であることを私は知ってGroovyClassLoaderいます。

4

3 に答える 3

7

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>
于 2013-06-24T18:04:16.413 に答える