Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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
Java 应用服务器如何注入私有字段?_Java_Dependency Injection_Annotations - Fatal编程技术网

Java 应用服务器如何注入私有字段?

Java 应用服务器如何注入私有字段?,java,dependency-injection,annotations,Java,Dependency Injection,Annotations,我看到了这个问题 关于如何手动注入带注释的私有字段(方法是添加setter (或通过构造函数) 但是,关键是应用程序服务器(如glassfish、axis2、jboss等)如何 能够注入到最终的私有字段中(无需添加setter或构造函数) 到用户类)中 引用引用的问题: public SomeClass { @Inject private SomeResource resource; } 他们是否使用允许访问私有字段的定制JVM(不是标准JVM) 谢谢这是一个简单的反射“技巧”。它依

我看到了这个问题

关于如何手动注入带注释的私有字段(方法是添加setter (或通过构造函数)

但是,关键是应用程序服务器(如glassfish、axis2、jboss等)如何 能够注入到最终的私有字段中(无需添加setter或构造函数) 到用户类)中

引用引用的问题:

public SomeClass {
  @Inject
  private SomeResource resource;
}
他们是否使用允许访问私有字段的定制JVM(不是标准JVM)

谢谢

这是一个简单的反射“技巧”。它依赖于强制以编程方式访问成员的方法:

为此设置可访问标志 对象设置为指定的布尔值。 值为true表示 反射对象应该抑制Java 启用时进行语言访问检查 用过。值false表示 反射对象应强制执行 Java语言访问检查

反射API用于获取字段句柄,调用
setAccessible()
,然后可以由注入框架设置

请看一个例子


没有魔法,没有自定义VM。

在skaffman的帮助下,我编写了这个简单的示例,说明如何在没有setter的情况下进行注入。 也许这对我有帮助

运行输出:

------- fields : --------
 -> private int MyClass.theValue
       found annotation: @Inject()
       injecting !
23

还值得注意的是,一些框架通过自定义类加载器利用字节码工程来实现相同的结果,而不需要反射成本(反射有时可能非常昂贵)

这是私有的,但不是最终的。你错过了代码块中的期末考试了吗?因为我认为不可能注入私人最终成员。(如果我错了,请纠正我。)@Willi:你是对的。在下面的代码示例中,我将其设置为final,但doInjection()方法即使没有引发任何错误,该值也没有更改。所以我取消了决赛。
------- fields : --------
 -> private int MyClass.theValue
       found annotation: @Inject()
       injecting !
23