访问类属性';使用Java注释的值
我正在处理一个使用注释的java示例,我创建了一个简单的POJO(JavaBean),使用对其属性的注释。我希望能够创建这种类型的新对象,并使用创建的注释检索其属性的值 我的POJO:访问类属性';使用Java注释的值,java,annotations,javabeans,pojo,Java,Annotations,Javabeans,Pojo,我正在处理一个使用注释的java示例,我创建了一个简单的POJO(JavaBean),使用对其属性的注释。我希望能够创建这种类型的新对象,并使用创建的注释检索其属性的值 我的POJO: import java.io.Serializable; import annotations.BusinessObject; import annotations.BusinessObjectAttribute; import annotations.BusinessObjectName; import an
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!因此,只检测到第一个注释
我还被告知,可以使用这些注释访问对象属性值(类似于):
我该怎么办 听起来你也在寻找字段上的注释 例如,对于第一个专用字段:
myTask.getClass().getDeclaredFields()[0].getAnnotations()
注意:根据访问私有字段的方式,有时还需要首先确保其可访问:
...getDeclaredFields()[0].setAccessible(true);
[编辑]
这些值也可以从字段中访问。一个基本示例:
for (Field f : myTask.getClass().getDeclaredFields()) {
f.setAccessible(true);
System.out.println(f.getName() + "=" + f.get(myTask));
System.out.println(" annotations=" + java.util.Arrays.toString(f.getAnnotations()));
}
您需要遍历字段,获取它们的注释,并在注释匹配的任何位置设置值(它可以匹配多个字段):
@Retention(RetentionPolicy.RUNTIME)
public@interface Field1{}
@保留(RetentionPolicy.RUNTIME)
public@interface Field2{}
公共静态类欠测试{
@字段1
私有字符串字段1;
@字段2
私人int field2;
公共欠测试(字符串字段1,整数字段2){
此字段1=字段1;
this.field2=field2;
}
@凌驾
公共字符串toString(){
返回字段1+“=”+字段2;
}
}
publicstaticvoidsetter(objectobj,ClassI)我不仅想要得到注释,还想要得到使用该注释的字段的值!
for (Field f : myTask.getClass().getDeclaredFields()) {
f.setAccessible(true);
System.out.println(f.getName() + "=" + f.get(myTask));
System.out.println(" annotations=" + java.util.Arrays.toString(f.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);
}