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