나는 계측 클래스가 필요한 프로젝트 작업을하고 있습니다. 내 경우에는 계측을하는 것이 매우 편리하기 때문에 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
에 따르면
난 항상 '_V1'또는 '_v2를 추가 있습니다 '. 따라서 'LClass1_V1'또는 'LClass1_V2'로 이름을 바꿀 수 있다면 충분할 것입니다. – Aadarsh
필드를 완전히 제거한 다음 새 이름과 새 유형으로 새 필드를 추가 할 수 있습니까? – Nicholas
하지만 'setType()'을 추가하고 제거하는 데 차이가 없습니다 – Aadarsh