我正在使用一种逻辑,但我不知道是否可以做到这一点,我想为此使用注释,所以这是我的代码
public class Hola {
public JSONConverter() {
String message= getClass().getAnnotation(HolaAn.class).getMessage();
}
}
@Target({ElementType.FIELD})
public @interface HolaAn{
String getMessage();
}
public class MessageTest{
@HolaAn(getMessage= "MUNDO")
private Hola hola;
@Test
public void testMessage(){
hola= new Hola();
}
}
Run Code Online (Sandbox Code Playgroud)
但是我有 nullPointerException,我不太清楚如何使用我自己的注释,任何人都可以告诉我这是否可能以及如何做到这一点?
首先,您需要将注释保留更改为RUNTIME(默认为CLASS),以便可以反射性地读取它们。改成这样:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface HolaAn {
String message();
}
Run Code Online (Sandbox Code Playgroud)
您正在尝试从类获取注释,但您的注释位于字段上,这是唯一的元素目标。在此示例中,您可以通过以下方式获取注释:
@HolaAn(message = "MUNDO")
private Hola hola;
@Test
public void testMessageOnField() {
final Field[] fields = HolaTest.class.getDeclaredFields();
for (final Field field : fields) {
if (field.isAnnotationPresent(HolaAn.class)) {
final HolaAn annotation = field.getAnnotation(HolaAn.class);
Assert.assertTrue(annotation.message().equals("MUNDO"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果需要从类中获取注释,请将其更改为如下所示:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface HolaAn {
String message();
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以获得这样的注释消息:
@HolaAn(message = "CLASS")
public class Hola {
public Hola() {
final String message = this.getClass().getAnnotation(HolaAn.class).message();
System.out.println(message);
}
}
@Test
public void testMessage() {
hola = new Hola();
}
Run Code Online (Sandbox Code Playgroud)
或者:
@Test
public void testMessageSecondWay() {
hola = new Hola();
final Class<?> theClass = hola.getClass();
if (theClass.isAnnotationPresent(HolaAn.class)) {
final HolaAn annotation = theClass.getAnnotation(HolaAn.class);
Assert.assertTrue(annotation.message().equals("CLASS"));
}
}
Run Code Online (Sandbox Code Playgroud)
您应该将注释更改为
@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@interface HolaAn {
String getMessage();
}
Run Code Online (Sandbox Code Playgroud)
这是将注释编译到类文件所必需的。
现在您可以通过以下方式访问您的消息:
Field declaredField = new MessageTest().getClass().getDeclaredField(
"hola");
System.out.println((declaredField.getDeclaredAnnotation(HolaAn.class)
.getMessage()));
Run Code Online (Sandbox Code Playgroud)