gpt4 book ai didi

java - 使用 Java 注解访问类属性的值

转载 作者:行者123 更新时间:2023-12-02 11:34:07 26 4
gpt4 key购买 nike

我正在使用注释处理一个java示例,我使用对其属性的注释创建了一个简单的POJO(java bean)。我希望能够创建这种类型的新对象并使用创建的注释检索其属性的值。

我的POJO:

import java.io.Serializable;

import annotations.BusinessObject;
import annotations.BusinessObjectAttribute;
import annotations.BusinessObjectName;
import annotations.BusinessObjectPolicy;
import annotations.BusinessObjectRevision;
import annotations.BusinessObjectVault;

@BusinessObject
public class IndusTask implements Serializable{

/**
*
*/
private static final long serialVersionUID = 1L;


// Mandatory to create new object !
@BusinessObjectName
private String taskName;
@BusinessObjectRevision
private String taskRevision;
@BusinessObjectVault
private String vault;
// Mandatory to invoke iTask.create(context, policy) in Database
@BusinessObjectPolicy
private String policy;

//Specific attributes
@BusinessObjectAttribute
private String taskDescription;
@BusinessObjectAttribute
private String creationDate;
@BusinessObjectAttribute
private Integer weight;

public IndusTask() {
}

public IndusTask(String taskName, String taskRevision, String vault, String policy, String taskDescription,
String creationDate, Integer weight) {
super();
this.taskName = taskName;
this.taskRevision = taskRevision;
this.vault = vault;
this.policy = policy;
this.taskDescription = taskDescription;
this.creationDate = creationDate;
this.weight = weight;
}

public String getTaskName() {
return taskName;
}

public void setTaskName(String taskName) {
this.taskName = taskName;
}

public String getTaskRevision() {
return taskRevision;
}

public void setTaskRevision(String taskRevision) {
this.taskRevision = taskRevision;
}

public String getVault() {
return vault;
}

public void setVault(String vault) {
this.vault = vault;
}

public String getTaskDescription() {
return taskDescription;
}

public void setTaskDescription(String taskDescription) {
this.taskDescription = taskDescription;
}

public String getCreationDate() {
return this.creationDate;
}

public void setCreationDate(String creationDate) {
this.creationDate = creationDate;
}

public Integer getWeight() {
return weight;
}

public void setWeight(Integer weight) {
this.weight = weight;
}

public String getPolicy() {
return policy;
}

public void setPolicy(String policy) {
this.policy = policy;
}

}

属性声明示例:*业务对象类型声明

package annotations;

import java.lang.annotation.*;

//@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface BusinessObject {

}

*业务对象名称属性:

package annotations;

import java.lang.annotation.*;

//@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BusinessObjectName {

}

我创建了一个 main 来测试是否检测到所有注释:

public class MainImpl {

public static void main(String[] args) {
// TODO Auto-generated method stub


IndusTask myTask = new IndusTask("mytstTask", "001", "eService Production", "TstTask Process",
"myTstTask Description", "2018/02/16@15:30:10:GMT", 200);

System.out.println(myTask.getClass().getAnnotations().length);

}

}

输出显示 1 !所以只检测到第一个注释!

我还被告知可以使用这些注释来访问对象属性值(类似于):

object.getClass().getAnnotations()

我该怎么办?

最佳答案

您需要遍历字段,获取其注释并在注释匹配的任何位置设置值(它可以匹配多个字段):

@Retention(RetentionPolicy.RUNTIME)
public @interface Field1 {}

@Retention(RetentionPolicy.RUNTIME)
public @interface Field2 {}

public static class UnderTest {

@Field1
private String field1;

@Field2
private int field2;

public UnderTest(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}

@Override
public String toString() {
return field1 + "=" + field2;
}
}

public static void setter(Object obj, Class<? extends Annotation> fieldAnnotation, Object fieldValue) throws IllegalAccessException {
for (Field field: obj.getClass().getDeclaredFields()) {
for (Annotation annot: field.getDeclaredAnnotations()) {
if (annot.annotationType().isAssignableFrom(fieldAnnotation)) {
if (!field.isAccessible()) {
field.setAccessible(true);
}
field.set(obj, fieldValue);
}
}
}
}

public static void main(String[] argv) throws IllegalAccessException {
UnderTest underTest = new UnderTest("A", 1);
System.out.println(underTest);

setter(underTest, Field1.class, "B");
setter(underTest, Field2.class, 2);
System.out.println(underTest);
}

运行此打印

A=1

B=2

关于java - 使用 Java 注解访问类属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49072090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com