当前位置: 首页 > 知识库问答 >
问题:

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

微生雨泽
2023-03-14

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

共有1个答案

龙俊良
2023-03-14

您可以像这样指定初始化器:

// 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();
}
 类似资料:
  • 静态字段何时初始化?如果我从未实例化过一个类,但我访问了一个静态字段,那么用于实例化私有静态字段的所有静态块和私有静态方法(按顺序)都在那一刻被调用了吗?或者什么时候启动应用程序?

  • 当一个类本身有一个静态实例时,我很难理解初始化顺序。另外,为什么

  • 问题内容: 我尝试了解通过引用同一封闭类对象初始化静态字段时初始化顺序的行为。 上面这段代码的输出是: 如果我将变量修改为除plain之外的其他任何内容: 输出为: 为什么会这样呢? 请注意,即使同时声明了两者,输出也是如此,在这种情况下,声明之前 问题答案: 静态最终成员先于其他静态成员初始化。 非最终静态成员按出现顺序初始化 因此,在您的第一种情况下: 构造函数在初始化之前首先被调用,因此被显

  • 问题内容: 这是一段Java代码: 它如何编译?初始化后已执行变量“ ture”的声明。据我所知,静态块和字段已经按照它们出现的顺序执行了。 现在,为什么实例块中的值9已被打印3次?顺便说一句,该类的实例已创建了3次。那不是功课,我正在学习Java进行认证。 问题答案: 关于第一个问题,静态块确实按照它们出现的顺序进行处理,但是在处理静态块之前,先处理声明。声明作为类 准备工作 的一部分(JLS§

  • 问题内容: 好吧,所以说我有一个看起来像这样的课: 我可以依靠类加载器来按顺序初始化那些字段,以便我可以依靠SERVLET_LOGGER在signupObservableAgent之前实例化吗? 问题答案: 是的,它们按照它们在源中出现的顺序进行了初始化。您可以在Java语言规范§12.4.2中阅读所有详细内容。请参阅步骤9,内容为: …以文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者

  • 问题内容: 我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样? 问题答案: 为什么要对静态变量进行确定性初始化而对局部变量不进行初始化? 了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。 另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清