2017-03-22 2 views
1

나는 계측 클래스가 필요한 프로젝트 작업을하고 있습니다. 내 경우에는 계측을하는 것이 매우 편리하기 때문에 javassist을 사용하고 있습니다.javassist : 클래스 및 필드 유형 이름 바꾸기

한다고 가정 클래스 1 :

public class Class1 { 
    Class2 class2; 
} 

그리고 2 등급 :

public class Class2 { 
    //Code 
} 

그리고 함수에 대한

나는 코드 다음 사용하여 설명 할 수있는 문제를 직면하고있어 정의 된 클래스에서 CtClass es를 가져오고 일부 코드 변환을 수행하십시오.

public void testFunction() throws NotFoundException { 
     ClassPool classPlool; 
     classPlool = ClassPool.getDefault(); 
     CtClass ctCls1 = classPlool.getAndRename("Class1", "Class1_V1"); 
     // instrument and load ctCls1 etc. 
     CtClass ctCls2 = classPlool.getAndRename("Class2", "Class2_V1"); 
     // instrument and load ctCls1 etc. 
    } 

으로, 나는 클래스의 이름을 변경, 그래서 Class1의 필드 Class2 class2 유형 class Class2입니다,하지만 클래스는 Class2_V1로 이름이 변경됩니다. 필드 유형도 LClass2에서 LClass2_V1으로 변경하고 싶습니다.

ctCls1은 다음과 같습니다 [email protected][changed public class Class1_V1 fields=Class1_V1.class2:LClass2;, [email protected][public Class1_V1()V], methods=]

PS : 나는 다른 기기와 클래스의 두 가지 버전을로드했습니다, 그래서 내 경우에는 가장 좋은 방법입니다. 또한 문제를 검색했지만 해결 방법이 없습니다 (예 : this link). 필드 이름은 바꾸지 만 입력하지는 마십시오. documentationJavassist에 따르면

+0

난 항상 '_V1'또는 '_v2를 추가 있습니다 '. 따라서 'LClass1_V1'또는 'LClass1_V2'로 이름을 바꿀 수 있다면 충분할 것입니다. – Aadarsh

+0

필드를 완전히 제거한 다음 새 이름과 새 유형으로 새 필드를 추가 할 수 있습니까? – Nicholas

+0

하지만 'setType()'을 추가하고 제거하는 데 차이가 없습니다 – Aadarsh

답변

1

:

새로운 클래스는 기존 클래스의 사본으로 정의 할 수 있습니다.

ClassPool pool = ClassPool.getDefault(); 
CtClass cc = pool.get("Point"); 
cc.setName("Pair"); 

이 프로그램은 최고 수준의 포인트에 대한 CtClass 개체를 가져옵니다 : 아래의 프로그램이 있다고한다.

그런 다음 setName()을 호출하여 새 이름 쌍을 CtClass 개체에 지정합니다.

이 호출 후에 해당 CtClass 개체가 나타내는 클래스 정의의 클래스 이름이 모두 Point에서 Pair로 변경됩니다. 클래스 정의의 다른 부분은 변경되지 않습니다.

편집 : 당신이 클래스를 탐색 할 수있는 클래스의 필드 유형의 이름을 변경하고 Javassist 유형을 통해 그것을 얻기 위하여CtField

ClassPool pool = ClassPool.getDefault(); 
CtClass cc = pool.get("Class1"); 
CtField cf = cc.getField("class2NameIntoClass1"); 
CtClass cc2 = cf.getType(); 
cc2.setName("Class2NewName"); 
+0

'class2'의 이름을 바꾸고 있지만 'class1'에는'class2' 유형의 필드가 있습니다. 메서드는 참조 할 수 없습니다. 'class1'에서 타입의 이름을 변경하십시오. – Aadarsh