gpt4 book ai didi

Javassist:将静态类字段初始化为给定值?

转载 作者:搜寻专家 更新时间:2023-11-01 03:07:33 28 4
gpt4 key购买 nike

我想将一些对象实例绑定(bind)到使用 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 添加一个在运行时给定的现有实例初始化的静态字段?

最佳答案

你可以像这样指定一个初始化器:

// 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();
}

关于Javassist:将静态类字段初始化为给定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287970/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com