2014-01-10 7 views
1

지정된 주석으로 주석 된 필드가있는 bean 클래스를 생성 할 수 있습니까? 빈은 생성 될 수 있지만 주석은 무엇인지 ... 나는 그것에 대해 아무 것도 찾을 수 없으므로 나는 그것에 대해 강한 의구심을 가지며 여기에 묻는 것이 유일한 방법입니다 ...CGLib - 일부 필드가있는 빈을 만들고 그 위에 주석을 추가 하시겠습니까?

// 도움이 될만한 것을 발견했습니다 ...이 코드를 확인하십시오. javassist 기능을 사용합니다.

// pool creation 
    ClassPool pool = ClassPool.getDefault(); 
    // extracting the class 
    CtClass cc = pool.getCtClass(clazz.getName()); 
    // looking for the method to apply the annotation on 
    CtField fieldDescriptor = cc.getDeclaredField(fieldName); 
    // create the annotation 
    ClassFile ccFile = cc.getClassFile(); 
    ConstPool constpool = ccFile.getConstPool(); 
    AnnotationsAttribute attr = new AnnotationsAttribute(constpool, 
      AnnotationsAttribute.visibleTag); 

    Annotation annot = new Annotation("sample.PersonneName", constpool); 
    annot.addMemberValue("name", 
      new StringMemberValue("World!! (dynamic annotation)", ccFile.getConstPool())); 
    attr.addAnnotation(annot); 

    // add the annotation to the method descriptor 
    fieldDescriptor.getFieldInfo().addAttribute(attr); 

이 문제는 내가하는 방법이 할 수있는 방법이 ... 새로 만든 유형에 기존의 주석을 적용 모르겠입니다?

+0

님이 주석 달았습니다. 요구 사항에 맞는 라이브러리를 작성했습니다. 내 업데이트 답변을 참조하십시오. –

답변

3

짧은 대답은 아니오입니다. Cglib 자체는 이러한 기능을 지원하지 않습니다. 주석은 Java에 도입되기 전에 Cglib은 꽤 오래되었고 코어가 작성되었습니다. Eversince, cglib 너무 많이 유지되지 않았습니다.

그러나 EnhancerClassVisitor으로 ASM (도구 cglib이 빌드 됨)을 밀착시키고 주석을 수동으로 추가 할 수 있습니다. 그러나 ASM으로 bean을 직접 빌드 할 것을 권장합니다. 어려운 작업이 아닌 단순한 POJO 빈의 경우 ASM은 잘 관리되고 잘 문서화 된 도구입니다. Cglib은 그렇지 않습니다.

업데이트 : 당신은 내 라이브러리 귀하의 요구 사항을 제공 할 수 Byte Buddy 좀보고 할 수 있습니다. 다음 코드는 String 공개 입력란 foo의 하위 클래스를 만들고 표시 유형은 public입니다. 이 필드에는

@Retention(RetentionType.RUNTIME) 
@interface MyAnnotation { } 

class MyAnnotationImpl implements MyAnnotation { 
    @Override 
    public Class<? extends Annotation> annotationType() { 
    return MyAnnotation.class; 
    } 
} 

new ByteBuddy() 
    .subclass(Object.class) 
    .defineField("foo", String.class, MemberVisibility.PUBLIC) 
    .annotateField(new MyAnnotationImpl()) 
    .make() 
    .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) 
    .getLoaded() 
    .newInstance(); 
+0

확인. 내 업데이트 된 anwser를 참조하십시오. – user2902211

+1

'CtClass'는 주석을 읽을 수있게합니다. (http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/html/javassist/CtClass.html) 이러한 주석을 재정의 된 유형에 다시 연결할 수 있습니다. –

+0

그러나 이러한 주석이 유형에 적용되지 않으면 어떻게 될까요? 메서드 (@AnnotationX 개체)와 같은 메서드에서 가져옵니다. 그런 다음 동일한 주석으로 주석 된 필드로 객체가있는 빈으로 변환하고 싶습니다. – user2902211