검색
다른 검색어로 검색을 시도하시기 바랍니다.
BCI 기술과 BCEL
BCI(Byte Code Instrumentation) 란 *.class 와 같이 바이트코드로 컴파일된 자바 클래스파일을 수정하고 다루는 도구 혹은 기술이다.
자바는 javac 로 컴파일할때 완전한 기계어 코드가 아닌 소스와의 중간형태인 Byte Code 로 생성하게되는데 이게 도움을 받으면 어느정도 읽고 수정할수 있다.
자바에서도 클래스파일을 다루는 법을 제공하며 응용 라이브러리로는
Apache Commons 의 BCEL ( 정식 5.2, 개발버전 6.0)
Object Web 의 ASM
JBOSS 의 JavaAssist
등이 있고 본 블로그에서는 APACHE의 BCEL을 주로 다룰 예정이다.
필자가 다루고있는 라이브러리는 BCEL (Byte Code Engineering Library) 인데 이름만큼이나 정석(?)의 사용법을 제공한다.
바이트코드를 수정하고 작업을 추가하는 등의 작업을 바이트코드엔지니어링 이라고 하는데 앞으로는 작업 이라고 줄여서 말하겠다.
추측하건데 BCEL설계할당시에는 이미 컴파일된 *.class 파일작업만을 염두해두고 만들어졌을것이라고 생각한다.
라이브러리 측면에서 볼때 실시간으로 혹은 임시적으로 클래스파일을 작업하는 부분에대해선 제공되는 사항이 없는데,
이는 ASM 과 Javaassist 도 마찬가지.
그런데 자바1.5 부터 transform 등의 방법으로 런타임 작업이 가능해졌다.
class 파일을 작업하여 영구적으로 저장하는것을 영구작업,
런타임에 작업하여 임시적으로 사용하는것을 임시작업 이라고 하고 이야기를 진행하겠다.
왜 굳이 BCI 기술을 이용해서 코드에 새로운 작업을 추가하는가?
BCI 기술에대해 처음 접하는 대부분의 사람들이 위와같은 질문을 한다.
"왜 굳이 어려운기술을 써가며 작업을 추가하느냐", "소스를 추가하면 되는거 아니냐" 등의 많은 질문을 받는데, 반대로 질문을 던져보면 답은 쉽게 나온다.
만약에 소스가 없거나, 라이센스문제등으로 소스추가나 수정이 불가능한경우라면 어떻게 할 것인가 하는 질문이다.
BCI의 이점은 여기에있다. 소스가 필요없다. 어떤 라이브러리를 사용하건 타겟클래스와 메소드나 변수정보 등만 파악할 수 있으면 작업이 가능하다.
또한 반복적인 작업을 줄일수도 있다.
작업하는 메소드 를 만들어놓고 특징이 비슷한 여러개의 메소드에 적용 할 수도 있다.
그러나 가장 큰 메리트는 역시 '소스수정을 직접 하지 않아도 추가절차를 진행할 수 있다.' 는 점이다.
소스를 추가하는게 부담스럽지않은 소규모의 웹 어플리케이션에선 큰 차이가 없지만, 만약 컴파일된 코드만 수십 수백개가 되는 대형 어플리케이션이라면
이야기는 달라진다. 서비스를 제공하기위해 타겟 혹은 고객이 추가적으로 수고해야하는 일을 없앨 수 있다.
'Study > BCI&BCEL&ASM' 카테고리의 다른 글
BCEL 중요용어 및 사용법 간단 소개. (0) | 2015.01.12 |
---|---|
bcel 6 다운로드 (0) | 2015.01.12 |
ASM 으로 바이트코드 변경하기. (0) | 2014.08.21 |
BCEL 그나마 나은 참고자료.. (0) | 2014.08.04 |
bcel api doc (0) | 2014.08.01 |
PHP html5 css3 음악 플레이어.
php로 음악파일 목록을 불러와 playlist 로 만들고 자동재생되도록 만들어보았습니다.
1차적으론 개인 파일서버에있는 음악들을 들으려고 만들었는데,
이정도면 배포해도 괜찮겠지 싶어서 일단은 배포합니다.
파일은 <name>.php 로 음악이 있는 폴더에 저장하면 됩니다. 파일을 직접 올리지는 않겠습니다.
php 에서 같은 디렉토리 내의 파일목록과 디렉토리목록을 리스트업해서 재생해줍니다.
우분투 환경에서 테스트하였고, 윈도우의 경우는 php가 한글을 인식하는게 문제가 있어서 안될듯..
재배포와 수정은 자유이지만 처음 주석부분은 수정하지 않았으면 좋겠다.
One file php html5 css3 jquery music player.
이름도 한번 지어볼까..? 구너플?
'Develop' 카테고리의 다른 글
구너갤러리 15.11.2 (0) | 2015.11.16 |
---|---|
구너갤러리 15.11 (0) | 2015.11.04 |
구너 플레이어 15.11 (1) | 2015.11.04 |
베지에 곡선 (Bezier Curve) (1) | 2015.09.04 |
[구너 플레이어] 15.8 단일파일 php 음악 플레이어. (4) | 2015.08.06 |
_h5ai audio,video autoplay
_h5ai/client/js/script.js 를 에디터로 연다.
open _h5ai/client/js/script.js with editer
아래 코드를 최상단에 추가한다. insert code follow on top.function nexts(){var evt=document.createEvent('MouseEvents');evt.initMouseEvent('click',true,false,document,0,0,0,0,0,false,false,false,false,0,null);document.getElementById("pv-next-area").dispatchEvent(evt)} and ("controls","controls").attr("src",e) 를 찾아(replace to) ("controls","controls").attr("src",e).attr("onended","nexts()") 로 치환한다.(this)
'Study > JavaScript' 카테고리의 다른 글
클로저(Closure) 의 특성과 응용 그리고 실수 (0) | 2017.01.05 |
---|---|
Canvas Context 메소드 확장하기. (0) | 2016.05.10 |
JavaAgents 사용하기.
javaagent 제작에대한 국내 자료가 상당히 없는거같다. 그나마 제니퍼소프트에서 만드는 제니퍼 자료가 구할만한 자료 .. 라고 해야하나... 게다가 자바에이전트에대한 설명은 무지 어렵거나 스쳐지나갈뿐 ....
아무튼
설명이 되어있는 자바독은
http://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html
자바 에이전트의 기능은 하나라고 생각한다.
다른 함수(main) 이 실행되기전에 혹은 실행하면서, JVM 뜨면서 등으로 클래스를 로드하고 수행해주는 역할 정도일거다.
본 블로그에서 다루는 bcel/asm 등의 bci 기술과 접목시킨다면 실시간 클래스 분석도 가능해진다. (APM 대부분이 그런 같은 방법사용)
다음 내용은
http://stackoverflow.com/questions/11898566/tutorials-about-javaagents
를 참고했다.
premain 을 이용한 예제.
1. main 과 비슷하게 premain 을 선언한다.
2. manifest.mf 혹은 .txt 파일을 만들어 Premain 에대한 정보를 준다.(Premain 의 위치)
Premain-Class: ex.ex.Example
(주의! ':'뒤에 띄어쓰기,클래스명뒤에 띄어쓰기, 마지막에 줄바꿈 꼭 할것 )
3. jar로 매니페스트와 함께 묶어주기.
4. 실행하기
java -javaagent:exagent.jar targetclass
(주의! 실행할 클래스는 자바에이전트의 선언 이후에 써야한다.)
이 방법들과 bcel, AOP 기법들을 이용해 APM을 제작하는 것이 가능하다.
ASM 으로 바이트코드 변경하기.
ASM 에 대한 정리가 잘 되어있다.
'Study > BCI&BCEL&ASM' 카테고리의 다른 글
bcel 6 다운로드 (0) | 2015.01.12 |
---|---|
BCI 기술과 BCEL (0) | 2015.01.12 |
BCEL 그나마 나은 참고자료.. (0) | 2014.08.04 |
bcel api doc (0) | 2014.08.01 |
BCEL 메소드 추가하기 (0) | 2014.08.01 |