2017-03-16 5 views
0

Javassist와 관련된 몇 가지 사항에 대한 설명이 필요합니다.Javassist 설명 (수입 및 삽입)

ClassPool.importPackage 메서드는 실제로 클래스에 행 번호를 추가합니까? 예를 들어 이것이 내 코드 인 경우 :

public class Test { 
    public static void main(String[] args){ 
     System.out.println("Message!");// Line 3 
    } 
} 

그리고 "java.util. *;" 패키지, 그 print 문은 이제 4 번 줄에 올까?

2. 클래스 행 번호가 아닌 메소드 행 번호에 코드를 추가하는 방법이 있습니까? CtMethod.insertAt()에는 클래스 행 번호가 필요합니다.

아무도이 문서에 대해 아무 것도 모르는 경우 문서가 매우 모호하고 다른 사람이이 질문을 할 필요가 있음을 알 수 없으므로 설명을 매우 감사하게 생각합니다.

답변

0

Javassist는 사용자가 말하지 않는 한 줄 번호를 변경하지 않습니다. Javassist에서 클래스를 가져 오면 클래스 파일을 변경하지 않지만 Javassist에게 정규화되지 않은 클래스 이름을 찾아야하는 패키지의 힌트 역할을합니다. 바이트 코드에서 클래스 이름은 항상 완전합니다.

또한 Javassist는 메소드 수준에서 insertAt를 지원하지 않습니다. 그러나 메소드의 지침을 반복하고 첫 번째 행 번호를 찾는 방법으로이를 에뮬레이트 할 수 있습니다. 단순히이 숫자에 오프셋을 추가하십시오.

+0

미안하지만이 방법이 어리석은 생각이 들지만 메서드의 지침을 반복 실행하고 첫 번째 줄 번호를 찾는 예가있을 수 있습니까? – CoalCoding

+0

'CtMethod'에서'MethodInfo' 인스턴스를 얻을 수 있습니다. 그것은 당신의 목적에 부합하는 편의 메소드'getLineNumber'를 정의합니다 : https://jboss-javassist.github.io/javassist/html/javassist/bytecode/MethodInfo.html#getLineNumber-int-'- 'insertAt' 접근법이 처음에는 작동하지 않는 곳에 값이 정의되어 있지 않으면 '1'을 반환합니다. –