esolve
V2EX  ›  问与答

注解是如何保证注值的,原理是啥?

  •  
  •   esolve · Apr 25, 2017 · 1953 views
    This topic created in 3334 days ago, the information mentioned may be changed or developed.

    我试了一下这篇文章里的注解 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 发现并没有能注值

    7 replies    2017-04-25 16:30:30 +08:00
    esolve
        1
    esolve  
    OP
       Apr 25, 2017
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface FruitName {
    String value() default "";
    }



    public class Apple {

    @FruitName("Apple")
    private String appleName;



    public void setAppleName(String appleName) {
    this.appleName = appleName;
    }
    public String getAppleName() {
    return appleName;
    }

    public void displayName(){
    System.out.println("水果的名字是:"+getAppleName());
    }
    }

    这种没有能够注值啊
    Cbdy
        2
    Cbdy  
       Apr 25, 2017
    注解是 java 的一种元数据,本身不提供功能
    esolve
        3
    esolve  
    OP
       Apr 25, 2017
    @Cbdy 那注值是如何实现的?
    LaudOak
        4
    LaudOak  
       Apr 25, 2017 via Android
    要配合反射注值吧
    esolve
        5
    esolve  
    OP
       Apr 25, 2017
    @LaudOak 有没有原理分析的文章啊
    大致是如何通过反射使得注解能够注值的。。
    LaudOak
        6
    LaudOak  
       Apr 25, 2017   ❤️ 1
    ```
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import java.lang.reflect.Field;

    public class Reflect {

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface FruitName {
    String value() default "";
    }

    public static class Apple {
    @FruitName("apple")
    public String name;
    }

    public static void main(String... args) throws Exception {
    Apple apple = new Apple();
    Class clz = apple.getClass();
    Field[] fields = clz.getDeclaredFields();
    for (Field field : fields) {
    if (field.isAnnotationPresent(FruitName.class)) {
    field.set(apple, field.getAnnotation(FruitName.class).value());
    }
    }
    System.out.println(apple.name);
    }

    }

    ```

    http://tutorials.jenkov.com/java-reflection/annotations.html
    https://keyholesoftware.com/2014/09/15/java-annotations-using-reflection/
    http://www.journaldev.com/1789/java-reflection-example-tutorial
    https://docs.oracle.com/javase/tutorial/reflect/member/fieldValues.html
    aristotll
        7
    aristotll  
       Apr 25, 2017
    RetentionPolicy.RUNTIME 的通过反射来取
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3725 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 04:24 · PVG 12:24 · LAX 21:24 · JFK 00:24
    ♥ Do have faith in what you're doing.