Ond*_*žka 4 java static initialization bytecode-manipulation 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( CtField.Initializer.??? );
return subClass.toClass();
Run Code Online (Sandbox Code Playgroud)
但是当我检查 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();
Run Code Online (Sandbox Code Playgroud)
这相当于创建以下内容
class fullName extends Foo {
static SomeMetaData DEF = new SomeMetaData();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4311 次 |
| 最近记录: |