4

Javassist を使用して作成されたクラスにオブジェクト インスタンスをバインドしたいと考えています。このオブジェクトは何らかのソースから読み取られます。データは事前​​にわかりません。

    // Create the class.
    CtClass subClass = pool.makeClass( fullName );
    final CtClass superClass = pool.get( Foo.class.getName() );
    subClass.setSuperclass( superClass );

    // Add a static field containing the definition. // Probably unachievable.
    final CtClass defClass = pool.get( SomeMetaData.class.getName() );
    CtField defField = new CtField( defClass, "DEF", subClass );
    defField.setModifiers( Modifier.STATIC );
    subClass.addField( CtField.Initializer.??? );

    return subClass.toClass();

しかし、API を確認したところ、Javassist は「これを呼び出す」または「それをインスタンス化する」または「この定数を使用する」という観点から初期化を格納する実際のバイトコードを作成しているようです。

実行時に指定された既存のインスタンスに初期化された静的フィールドを追加するよう Javassist に依頼する方法はありますか?

4

1 に答える 1

5

次のように初期化子を指定できます。

// Create the class.
CtClass subClass = pool.makeClass( fullName );
final CtClass superClass = pool.get( Foo.class.getName() );
subClass.setSuperclass( superClass );

// Add a static field containing the definition. // Probably unachievable.
final CtClass defClass = pool.get( SomeMetaData.class.getName() );
CtField defField = new CtField( defClass, "DEF", subClass );
defField.setModifiers( Modifier.STATIC );
subClass.addField( defField, CtField.Initializer.byNew(defClass) );

return subClass.toClass();

これは、以下を作成することと同等です

class fullName extends Foo {
    static SomeMetaData DEF = new SomeMetaData();
}
于 2013-06-26T01:34:49.610 に答える