Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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_Reflection_Constructor_Annotations_Runtime - Fatal编程技术网

Java 检测传递给构造函数的给定对象中的当前注释

Java 检测传递给构造函数的给定对象中的当前注释,java,reflection,constructor,annotations,runtime,Java,Reflection,Constructor,Annotations,Runtime,简而言之,我的问题是:如何检测给定用户类/对象的java注释是否存在(以及是否在正确的位置) “问题”的细节 假设我有两个java类: public class Line { private List<Cell> cells; public Line(Object... annotatedObjects) { // check if annotations @Line and @Cell are present in annotatedObjects.

简而言之,我的问题是:如何检测给定用户类/对象的java注释是否存在(以及是否在正确的位置)

“问题”的细节

假设我有两个java类:

public class Line {
   private List<Cell> cells;

   public Line(Object... annotatedObjects) {
     // check if annotations @Line and @Cell are present in annotatedObjects.
   }

   // getter/setter for cells.
}

public class Cell {
   // some members
   // some methods
}
我还有一组用户类(本例中有两个),其中包含我指定的@Line和@Cell注释,如:

@Line(name="pqr", schema="three")
public class AUserClass {
   @Cell
   private String aString;
}

@Line(name="xyz", schema="four")
public class AnotherUserClass {
   @Cell(name="birthday")
   private Date aDate;
}
问题是:当我实例化一个新行对象时,我希望能够将用户类/对象传递到行构造函数中。然后,行构造函数确定传递的用户类/对象是否是可以处理的有效类。只有具有类的
@Line
注释以及其成员的至少一个
@Cell
注释的用户类才是可以传递到Line对象的构造函数中的有效对象。 所有其他传递的对象无效。传递有效的用户对象时,该对象中标记为
@Cell
的所有可用成员都将转换为单元格对象并添加到单元格列表中

我的问题是:

  • 这是否可以在运行时检测此对象/类中的注释,并且仅检测此传递的对象(我不想扫描类路径上的注释!)
  • 是否可以检测标记成员的
    @单元格的数据类型?这是必需的,因为Cell类不接受所有数据类型
  • 是否可以检索实际的成员名称(在java文件中指定),以便用户不必指定成员单元名称。我希望用户能够写入
    @Cell
    (无名称)和
    @Cell(name=“aName”)
    ,并且当仅指定
    @Cell
    时,将使用成员的名称。我不知道使用反射在运行时是否仍然可以使用这些信息
  • 如何检测注释是否在正确的位置?如果代码是这样标记的,那么应该忽略对象(或者可能引发异常)?
    @Cell//噢,那不好:(
    公共类错误类{
    //一些成员
    }
  • 你能提供一些启动代码吗,这样我就知道了一些如何处理这个问题。我对注释和反射非常陌生。顺便说一句:我使用的是最新的jvm 1.6+
  • 谢谢你的帮助

    Q.1:这是否可以在运行时检测这个对象/类中的注释,并且只检测这个传递的对象(我不想扫描类路径上的注释!)

    是的,很有可能使用



    注意仅限于保留的注释可用,

    首先,您需要在注释上设置保留策略,以便您可以通过反射来阅读注释

      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.TYPE)
      public static @interface Line {
    
      }
    
      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.FIELD)
      public static @interface Cell {
    
      }
    
    其次,您需要测试类是否具有带有
    isAnnotationPresent(annotationClass)
    的行注释。此方法可从
    java.lang.class
    和java.lang.reflect.Field访问

    注意:您需要检索
    class.getDeclaredField(fieldName)
    专用的字段


    3.
    我不认为可以使注释具有基于propertyName的默认值,但可以通过提供默认值
    String name()default
    使名称可选,并在遍历字段时检查该值,或者使用存储在
    name()中的值
    propertyName

    回答我自己的一些问题:1.参见上文;2.使用java.lang.reflect.Field方法:getName()和getType()找出字段的数据类型;4.参见上文;5.参见java第四版中的思考,以及java反射的实际应用(关于答案的好资源).3.仍未回答。@user504343所以您希望@Cell.name默认为它所使用的属性名?是的,这是真的。如果字段有@Cell,那么为Cell.name选择字段名。如果字段有@Cell(name=“hello”),那么选择它作为Cell.name。如果@Cell(name=”“)也选择字段名。您能解释一下吗?@Don
    this.getClass().isAnnotationPresent(SomeAnnotation.class)
    ,它将始终为false。因为getClass提供类对象的实例,但它不包含预期的注释。您需要检索要检查该类是否存在特定注释的类的类实例,请检查javadocyah检查,似乎无法在运行时执行此操作。
    @Cell // oh oh, that's no good :(
    public class WrongClass {
    // some members
    }
    
    @Deprecated
    public class AnnotationDetection {
    
        public static void main(String[] args) {
            AnnotationDetection annotationDetection = new AnnotationDetection();
            System.out.println(annotationDetection.getClass().isAnnotationPresent(Deprecated.class));
        }
    }
    
      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.TYPE)
      public static @interface Line {
    
      }
    
      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.FIELD)
      public static @interface Cell {
    
      }