How do app servers inject into private fields?
annotations, dependency-injection, java
Solution
It's a simple reflection "trick". It relies on the `Field.setAccessible()` method to force the member to be accessible programmatically:
Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java language access checks.
The Reflection API is used to get a handle on the field, `setAccessible()` is called, and then it can be set by the injection framework.
See an example here.
No magic, no custom VM.
Problem
I saw this question Inject into private, package or public field or provide a setter? about how to manually inject into annotated private fields (The way is adding setters or through a constructor) But, the point is how do an application server (like glassfish, axis2, jboss, ...) is able to inject into a final private field (without adding setters or constructors to the user class)? Quoting the cited question: ``` public SomeClass { @Inject private SomeResource resource; } ``` Do they use a customized JVM (not the standard one) that allows to access private fields? Thanks