Java 检测传递给构造函数的给定对象中的当前注释
简而言之,我的问题是:如何检测给定用户类/对象的java注释是否存在(以及是否在正确的位置) “问题”的细节 假设我有两个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.
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类不接受所有数据类型
@Cell
(无名称)和@Cell(name=“aName”)
,并且当仅指定@Cell
时,将使用成员的名称。我不知道使用反射在运行时是否仍然可以使用这些信息@Cell//噢,那不好:(
公共类错误类{
//一些成员
}
注意仅限于保留的注释可用,首先,您需要在注释上设置保留策略,以便您可以通过反射来阅读注释
@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=”“)也选择字段名。您能解释一下吗?@Donthis.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 {
}