How do app servers inject into private fields?

前端 未结 3 1045
孤城傲影
孤城傲影 2021-02-08 04:13

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 addi

3条回答
  •  生来不讨喜
    2021-02-08 05:02

    With the help of skaffman I coded this simple example on how to inject without setters. Perhaps it helps (It did to me)

    //......................................................
    import java.lang.annotation.*;
    import java.lang.reflect.*;
    
    //......................................................
    @Target(value = {ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @interface Inject {
    }
    
    //......................................................
    class MyClass {
    
        @Inject
        private int theValue = 0;
    
        public int getTheValue() {
            return theValue;
        }
    } // class
    
    //......................................................
    public class Example {
    
        //......................................................
        private static void doTheInjection(MyClass u, int value) throws IllegalAccessException {
    
            Field[] camps = u.getClass().getDeclaredFields();
    
            System.out.println("------- fields : --------");
            for (Field f : camps) {
                System.out.println(" -> " + f.toString());
                Annotation an = f.getAnnotation(Inject.class);
                if (an != null) {
                    System.out.println("       found annotation: " + an.toString());
                    System.out.println("       injecting !");
                    f.setAccessible(true);
                    f.set(u, value);
                    f.setAccessible(false);
                }
            }
    
        } // ()
    
        //......................................................
        public static void main(String[] args) throws Exception {
    
            MyClass u = new MyClass();
    
            doTheInjection(u, 23);
    
            System.out.println(u.getTheValue());
    
        } // main ()
    } // class
    

    Run output:

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

提交回复
热议问题