2014-07-15 3 views
1

현재 java.lang.reflect.Method 객체의 주석을 변경해야합니다. 원본 객체의 복제본은 원본 메소드를 수정하지 않아야합니다. 그렇게하기 위해 나는 Library Javassist를 다운로드했다. 그래서, 기본적으로, 최적의 코드가 될 것이다 이렇게하려면 다음Javassist : CtMethod를 java.lang.reflect.Method로 변환하십시오.

java.lang.reflect.Method myMethod = /*obtain it*/; 
java.lang.reflect.Method myMethodClone = myMethod.clone(); 
myMethodClone.removeAllAnnotations(); 
myMethodClone.addAnnotation("@MyAnnotation(something=\"something\", etc"); 

그러나이 의사 코드와 유사한 코드가 불행하게도 불가능입니다. 내 문제를 해결하기 위해 javassist를 사용하려고했지만 또 다른 문제가 발생했습니다. Javassists CtMethod Object를 메서드 개체로 변환 할 수 없습니다. 원래 메서드가있는 클래스를 변경하지 않아도됩니다.

누구나 해결 방법이 있습니까?

답변

1

기본 Java Annotation & Method 클래스와 일부 리플렉션을 사용하여 코드를 관리 할 수있었습니다. 여기 (내 문제가 정말 특이하기 때문에, 아마 사람을 도움이되지 않습니다,하지만 당신은 ... 모를) 내가 그것을했다 (의사 코드) 방법은 다음과 같습니다

//Create Annotation 
MyAnnotationOld oldAnnotation; 
MyAnnotation modifiedAnnotation = new MyAnnotation{ 
public Class<? extends java.lang.annotation.Annotation> annotationType() {return oldAnnotation.annotationType();} 
public String propertyWhichShallRemainTheSame() {return oldAnnotation.propertyWhichShallRemainTheSame();} 
public String propertyWhichShallBeModified() {return "Modified Thingy";} 
} 

//Copy Method 
Method toCopy; 
Method copyMethod = Method.class.getDeclaredMethod("copy", (Class<?>[])null); 
copyMethod.setAccessible(true); 
Method copiedMethod = (Method) copyMethod.invoke(toCopy, (Object[]) null); 

//Add annotation to copied method 
Field field = Method.class.getDeclaredField("declaredAnnotations"); 
field.setAccessible(true); 
//Intantiate field !!IMPORTANT!! If you don't do this, the field will be null and thus return an error. 
copiedMethod.getAnnotations(); 
Map<Class<? extends Annotation>, Annotation> annotations = (Map<Class<? extends Annotation>, Annotation>) field.get(copiedMethod); 
annotations.put(MyAnnotation.class, modifiedAnnotation); 
2

javassist는 Java 클래스가 아닌 자신의 클래스 계층 구조를 사용합니다. javassist를 사용하기를 원한다면, 공식 문서를 읽고 그것이 어떻게 작동 하는지를 알기 바란다.

질문 : 변환 방법 < -> CtMethod 불가능합니다. 중독에서 복제 방법으로 무엇을 할 계획입니까? 클래스를 살 방법을 "복제"하고 싶다면? 원래 방법과 같은? 당신이 "이미 존재하는 방법"(또는 비슷한)을받을 것이기 때문에 불가능합니다.

javassist는 질문이 매우 모호하기 때문에 문제를 풀 수는 없지만 완전한 대답은 해결할 수 있습니다. 내 조언은 공식 doc에서 시작하거나 사용하는 것입니다 this tutorial

+1

이 답변 주셔서 감사합니다! 나는 이미 내 문제를 해결하고 해결책을 여기에 게시하는 것을 잊어 버렸습니다 ... 정말 죄송합니다. 지금 당장 할 것입니다. – Fly

+0

다른 사람들을 위해 해결책을 게시하고 동의하십시오! –

+0

지금 당장 했나요? 정말 늦어서 미안 해요. – Fly

관련 문제