BCEL로 런타임에 Arguments(매개변수들) 캡쳐하는 Instruction 추가하기.
Bcel 을 처음 다룰 당시에 만들었던 간단한 매개변수 출력하는 BCEL transform이다.
상당히 다듬어지지않은 막코드라서 감안해서 볼 필요가있다.
핵심부분은 밑줄과 주석을 달겠다.
이전글(http://blog.sanguneo.com/21) 에서 premain 을 이용한 javaagent 사용법은 간략하게 배웠는데.
BCEL을 여기에 접목시킨다는것은 조금 고차원적인 접근이 필요하다.(필자의 생각)
우선적으로 소스를 펼치기에 앞서 이론설명을 하자면 자바의 .class 파일은 완전하계 기계어(?)로 번역된것이 아닌,
그렇다고 소스형태도아닌 그 중간어딘가의 형태로 볼수있다.
javac 명령어를 실행하면 소스파일을 java컴파일하면 class 파일로 뱉어내게되는데, 이 class파일이 ByteCode의 목적집합코드인셈이다.(?)
길게 이야기할거없이 일단 class파일은 바이트코드로 되어있다고 보면 된다.
웹상의 대부분의 자료들(BCEL에 관련해서만) 은 BCEL을 이용한 정적인 BCI 기술을 보여준다.
정적인 BCI기술이라함은 class 파일화된 바이트코드를 다루는것이라 하겠다.
하지만! 이 정적인 BCI기술은 엄청난 한계가있는데,
상용프로그램에대한 라이센스문제(수정불가등의 조항), 묶여있는 클래스군 혹은 시스템클래스 에대한문제(rt.jar 등) 이 그것이다.
그렇다면 실시간으로 무엇을 어떻게 불러와서 사용할수 있을고 하니. 자바에서 기본적으로 Transform 을 지원한다.(since jdk1.5)
여기서 사용할것은 ClassFileTransformer 이다.
우선 클래스파일 트랜스포머 메소드는 아래처럼 implements 로 얻어와서 정의하여 사용한다.
주의) 소스가 동작하지않을 수 있음. 버그있으면 피드백 바랍니다. 원본 코드를 자꾸 수정해서 아래코드는 기억을 더듬어 작성했습니다.
즉, 위에서 사용한 방식을 요약하면
클래스 파싱->메소드 검사후 조건검색->새 메소드인스트럭션 생성->인스트럭션에 아규먼트출력절차 추가->원본 인스트럭션 추가->생성된 인스트럭션을 원본 메소드에 교체->메소드를 클래스젠에 추가->클래스젠으로부터 클래스를 받아 바이트코드로 출력 하게된다.
이를 지칭하여
BCEL on fly, dynamic BCEL 이라고 부르기도 한다.
'Study > BCI&BCEL&ASM' 카테고리의 다른 글
BCEL 중요용어 및 사용법 간단 소개. (0) | 2015.01.12 |
---|---|
bcel 6 다운로드 (0) | 2015.01.12 |
BCI 기술과 BCEL (0) | 2015.01.12 |
ASM 으로 바이트코드 변경하기. (0) | 2014.08.21 |
BCEL 그나마 나은 참고자료.. (0) | 2014.08.04 |