멤버 변수의 주석을 얻는 방법은 무엇입니까?
클래스의 일부 멤버 변수의 주석을 알고 싶습니다. 클래스 BeanInfo beanInfo = Introspector.getBeanInfo(User.class)
를 검사하는 데 사용 하고을 사용 하여 BeanInfo.getPropertyDescriptors()
특정 속성을 찾고 Class type = propertyDescriptor.getPropertyType()
를 사용 하여 속성의 Class를 가져옵니다.
하지만 멤버 변수에 주석을 추가하는 방법을 모르겠어요?
나는 시도 type.getAnnotations()
하고 type.getDeclaredAnnotations()
있지만, 모두 내가 원하지 무엇을, 클래스의 주석을 돌려줍니다. 예 :
class User
{
@Id
private Long id;
@Column(name="ADDRESS_ID")
private Address address;
// getters , setters
}
@Entity
@Table(name = "Address")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
class Address
{
...
}
주소의 주석 (@Column, 클래스 Address의 주석 (@Entity, @Table, @Cache)이 아님)을 얻고 싶습니다. 그것을 달성하는 방법? 감사.
for(Field field : cls.getDeclaredFields()){
Class type = field.getType();
String name = field.getName();
Annotation[] annotations = field.getDeclaredAnnotations();
}
참조 : http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html
모두가 주석을 얻는 데 문제를 설명하지만 문제는 주석의 정의에 있습니다. 주석 정의에 추가해야합니다 @Retention(RetentionPolicy.RUNTIME)
.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAnnotation{
int id();
}
특정 주석이 있는지 알아야하는 경우. 그렇게 할 수 있습니다.
Field[] fieldList = obj.getClass().getDeclaredFields();
boolean isAnnotationNotNull, isAnnotationSize, isAnnotationNotEmpty;
for (Field field : fieldList) {
//Return the boolean value
isAnnotationNotNull = field.isAnnotationPresent(NotNull.class);
isAnnotationSize = field.isAnnotationPresent(Size.class);
isAnnotationNotEmpty = field.isAnnotationPresent(NotEmpty.class);
}
다른 주석에 대해서도 ...
누군가를 돕길 바랍니다.
리플렉션을 사용하여 User
클래스의 모든 멤버 필드를 가져 와서 반복하고 주석을 찾아야합니다.
이 같은:
public void getAnnotations(Class clazz){
for(Field field : clazz.getDeclaredFields()){
Class type = field.getType();
String name = field.getName();
field.getDeclaredAnnotations(); //do something to these
}
}
getter 메서드에 대한 주석을 가져올 수 있습니다.
propertyDescriptor.getReadMethod().getDeclaredAnnotations();
비공개 필드의 주석을 가져 오는 것은 좋지 않은 생각 인 것 같습니다. 속성이 필드에서 지원되지 않거나 다른 이름의 필드에서 지원되는 경우 어떻게됩니까? 이러한 경우를 무시하더라도 사적인 것을보고 추상화를 깨뜨리는 것입니다.
package be.fery.annotation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.PrePersist;
@Entity
public class User {
@Id
private Long id;
@Column(name = "ADDRESS_ID")
private Address address;
@PrePersist
public void doStuff(){
}
}
그리고 테스트 클래스 :
package be.fery.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class AnnotationIntrospector {
public AnnotationIntrospector() {
super();
}
public Annotation[] findClassAnnotation(Class<?> clazz) {
return clazz.getAnnotations();
}
public Annotation[] findMethodAnnotation(Class<?> clazz, String methodName) {
Annotation[] annotations = null;
try {
Class<?>[] params = null;
Method method = clazz.getDeclaredMethod(methodName, params);
if (method != null) {
annotations = method.getAnnotations();
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return annotations;
}
public Annotation[] findFieldAnnotation(Class<?> clazz, String fieldName) {
Annotation[] annotations = null;
try {
Field field = clazz.getDeclaredField(fieldName);
if (field != null) {
annotations = field.getAnnotations();
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return annotations;
}
/**
* @param args
*/
public static void main(String[] args) {
AnnotationIntrospector ai = new AnnotationIntrospector();
Annotation[] annotations;
Class<User> userClass = User.class;
String methodDoStuff = "doStuff";
String fieldId = "id";
String fieldAddress = "address";
// Find class annotations
annotations = ai.findClassAnnotation(be.fery.annotation.User.class);
System.out.println("Annotation on class '" + userClass.getName()
+ "' are:");
showAnnotations(annotations);
// Find method annotations
annotations = ai.findMethodAnnotation(User.class, methodDoStuff);
System.out.println("Annotation on method '" + methodDoStuff + "' are:");
showAnnotations(annotations);
// Find field annotations
annotations = ai.findFieldAnnotation(User.class, fieldId);
System.out.println("Annotation on field '" + fieldId + "' are:");
showAnnotations(annotations);
annotations = ai.findFieldAnnotation(User.class, fieldAddress);
System.out.println("Annotation on field '" + fieldAddress + "' are:");
showAnnotations(annotations);
}
public static void showAnnotations(Annotation[] ann) {
if (ann == null)
return;
for (Annotation a : ann) {
System.out.println(a.toString());
}
}
}
도움이 되길 바랍니다 ...
;-)
내 방식
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class ReadAnnotation {
private static final Logger LOGGER = LoggerFactory.getLogger(ReadAnnotation.class);
public static boolean hasIgnoreAnnotation(String fieldName, Class entity) throws NoSuchFieldException {
return entity.getDeclaredField(fieldName).isAnnotationPresent(IgnoreAnnotation.class);
}
public static boolean isSkip(PropertyDescriptor propertyDescriptor, Class entity) {
boolean isIgnoreField;
try {
isIgnoreField = hasIgnoreAnnotation(propertyDescriptor.getName(), entity);
} catch (NoSuchFieldException e) {
LOGGER.error("Can not check IgnoreAnnotation", e);
isIgnoreField = true;
}
return isIgnoreField;
}
public void testIsSkip() throws Exception {
Class<TestClass> entity = TestClass.class;
BeanInfo beanInfo = Introspector.getBeanInfo(entity);
for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) {
System.out.printf("Field %s, has annotation %b", propertyDescriptor.getName(), isSkip(propertyDescriptor, entity));
}
}
}
또는 이것을 시도 할 수 있습니다
try {
BeanInfo bi = Introspector.getBeanInfo(User.getClass());
PropertyDescriptor[] properties = bi.getPropertyDescriptors();
for(PropertyDescriptor property : properties) {
//One way
for(Annotation annotation : property.getAnnotations()){
if(annotation instanceof Column) {
String string = annotation.name();
}
}
//Other way
Annotation annotation = property.getAnnotation(Column.class);
String string = annotation.name();
}
}catch (IntrospectonException ie) {
ie.printStackTrace();
}
이것이 도움이되기를 바랍니다.
ReferenceURL : https://stackoverflow.com/questions/4453159/how-to-get-annotations-of-a-member-variable
'IT박스' 카테고리의 다른 글
호버 링크에서 부트 스트랩 탐색 모음의 색상을 변경 하시겠습니까? (0) | 2020.12.28 |
---|---|
프로비저닝 프로파일 누락 : 앱은 embedded.mobileprovision이라는 파일에 프로비저닝 프로파일을 포함해야합니다. (0) | 2020.12.28 |
부트 스트랩 3 : 작은 화면 크기에서만 열 밀기 / 당기기 (0) | 2020.12.27 |
nodejs의 폴더 아래에 * .html 확장자로 파일 찾기 (0) | 2020.12.27 |
데코레이터 패턴을 언제 사용합니까? (0) | 2020.12.27 |