Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javassist:将静态类字段初始化为给定值?_Java_Static_Initialization_Javassist_Bytecode Manipulation - Fatal编程技术网

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

Javassist:将静态类字段初始化为给定值?,java,static,initialization,javassist,bytecode-manipulation,Java,Static,Initialization,Javassist,Bytecode Manipulation,我想将一些对象实例绑定到使用Javassist创建的类。 此对象是从某个源读取的,数据事先未知 // Create the class. CtClass subClass = pool.makeClass( fullName ); final CtClass superClass = pool.get( Foo.class.getName() ); subClass.setSuperclass( superClass ); // Add a static

我想将一些对象实例绑定到使用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();
}

我需要的不是
newsomemetadata()
,而是一个给定的实例,即对现有对象的引用。这取决于您尝试执行的操作。除非通过调试接口,否则在运行时无法发现类的对象实例。但是您仍然可以通过静态初始值设定项传递实例。公共静态_init(SomeMetaData inst){}。或者通过工厂方法。ie static SomeMetaData DEF=SomeMetaDataFactory.get()。实际上,factory方法可以工作-我可以设置某个类的静态字段,仅用于此目的,并通过调用()初始化新类的字段。我会努力的。谢谢