▶이동
  • 상구너 닷컴 블로그를 방문하신 여러분을 환영합니다 :)
  • 스팸 정책에 의해 일부 덧글·방명록차단될 수 있습니다.

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 이라고 부르기도 한다.




0 0
  • 공지사항
    중요한 개인정보필요한 경우가 아닌 경우 적지 마시고, 적으셨다면 비밀글 설정을 꼭 해주시기 바랍니다.
    스팸 필터 정책에 의해 영문만으로 작성된 글이나 무의미한 내용의 글은 등록이 되지 않을 수도 있습니다.