BCI ( Byte Code Instrumentation )์ ์ํ ASM 5.0 ํ๋ ์ ์ํฌ์ ๋ํด์ ๊ณต๋ถํด๋ณผ ์์ ์ ๋๋ค.
ASM์ ๋ํ ์ฌ์ฉ์๋ฉ๋ด์ผ ๋ฐ ๊ฐ๋ฐ์๊ฐ์ด๋๋ http://asm.ow2.org/index.html ์ด๊ณณ์์ ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
์ค๋์ ๊ทธ ์ฒซ ์๊ฐ. ์ฌ์ฉ์ ๋ฉ๋ด์ผ์ ์ฝ์ด๊ฐ๋ฉด์ ์กฐ๊ธ์ฉ ์กฐ๊ธ์ฉ ์ ๋ฆฌํด์ ๋ธ๋ก๊ทธ์ ์ฌ๋ฆด ์์ ์ ๋๋ค.
์ค๋์ ํด๋์ค ํ์ผ ์ฝ์ด์ ์ ๋ณด ์ป์ด์ค๋ ๋ถ๋ถ๋ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ ์ดํด๋ฆฝ์ค์ ASM 5.0 ํ๋ ์์ํฌ๋ฅผ ์ค์นํฉ๋๋ค.
http://forge.ow2.org/project/showfiles.php?group_id=23
์ ๋งํฌ์ ๊ฐ์๋ฉด ๋ฒ์ ๋ณ๋ก zip ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์์ต๋๋ค.( ๋งํฌ๊ฐ ๊นจ์ง ๊ฒ์ ์ผ๋ คํ์ฌ ์ต์ ๋ฒ์ 5.0.3์ ์ฒจ๋ถํ์์ต๋๋ค )
๋ค์ด๋ก๋ ๋ฐ์ zipํ์ผ์ ์์ถํด์ ๋ฅผ ํฉ๋๋ค.
์ด์ ์ดํด๋ฆฝ์ค๋ฅผ ์คํ์ํค๊ณ ํ๋ก์ ํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ฃผ๊ธฐ๋งํ๋ฉด ๋ฉ๋๋ค.
configure build pathํ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐํ๋ฉด ์ค์น ์๋ฃ!
์ ์ด์ ํ๋ ์์ํฌ๋ฅผ ์ค์นํ์ผ๋ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ํ์ฃ .
BCITestํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๋ฐ์ ์ธ ๊ฐ์ ํด๋์ค ํ์ผ์ ๋ง๋ญ๋๋ค.
BCITest.java
HelloWorld.java
MyClassVisitor.java
// BCITest.java ์์ค ( JUnit Test๋ฅผ ์ด์ฉํ์ต๋๋ค )
package BCItest;
import java.io.IOException;
import org.junit.Test;
import org.objectweb.asm.ClassReader;
public class BCITest {
@Test
public void test() throws IOException {
MyClassVisitor cv = new MyClassVisitor(327680); // ASM5 = 327680
ClassReader cr = new ClassReader("BCITest.HelloWorld"); // ๋์๋ฌธ์ ๊ตฌ๋ถ X ( bcitest.helloworld ๋ผ๊ณ ํด๋ ์คํ๋จ )
cr.accept(cv, 2);
}
}
ํ ์คํธ ํด๋ณด์ค ๋์๋ BCITest.HelloWorld ๋์ ์ ๋ค๋ฅธ ์์์ ํด๋์ค๋ฅผ ๋ฃ์ด๋ณด์๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด java.lang.String์ด๋ผ๋ ๊ฐ java.lang.Exception์ด๋ผ๋ ๊ฐ ํ๋ ํด๋์ค๋ค ๋ง์ด์ฃ .
// HelloWorld.java ์์ค
package BCItest;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!!");
}
}
// MyClassVisitor.java ์์ค
package BCItest;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.TypePath;
public class MyClassVisitor extends ClassVisitor {
public MyClassVisitor(int arg0) {
super(arg0);
}
@Override
public void visit(int version, int access, String name,
String signature, String superName, String[] interfaces) {
super.visit(version, access, name, signature, superName, interfaces);
System.out.println(name + " extends " + superName + " {");
}
@Override
public void visitEnd() {
super.visitEnd();
System.out.println("}");
}
@Override
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value) {
System.out.println(" " + desc + " " + name);
return super.visitField(access, name, desc, signature, value);
}
@Override
public MethodVisitor visitMethod(int access, String name,
String desc, String signature, String[] exceptions) {
System.out.println(" " + name + desc);
return super.visitMethod(access, name, desc, signature, exceptions);
}
}
์์์ MyClassVisitor๋ ClassVisitor๋ฅผ ์์ํ ๋ค ๋ช๋ช ๋ฉ์๋๋ง ์ค๋ฒ๋ผ์ด๋ ํ์ต๋๋ค.
์ฐ์ ์ ๊ฐ ์ ๊ณตํด๋๋ฆฐ ์์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ๋ฅผ ์งํํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.
BCItest/HelloWorld extends java/lang/Object {
<init>()V
main([Ljava/lang/String;)V
}
์ฌ๊ธฐ์ <init>์ ์์ฑ์๋ฅผ ๋งํ๊ณ ๋ง์ง๋ง์ V๋ void๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด๋ค๊ฐ์? ์ด๋ ต์ง ์์ฃ ?
HelloWorld ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ ๋ฃ์ด๋ณด๊ณ ( ๋ฆฌํด ํ์ ์ด๋ ํ๋ผ๋ฏธํฐ ๊ฐ์, ์ข ๋ฅ๋ฅผ ๋ค๋ฅด๊ฒ ํด์ ) ํ ์คํธํด๋ณด์ธ์~
์ฐธ๊ณ ๋ก ์๋๋ Type Descriptor ์ Method descriptor ์ ๋๋ค.
๋ญ๊ฐ ๋ญ ์๋ฏธํ๋์ง๋ฅผ ๋ํ๋ด์ฃผ๋ ๊ฑฐ๋๊น ์ด๊ฑฐ๋ ์ธ์ฐ์๋๊ฒ ์ข์๊ฑฐ์์~
์ฐธ๊ณ ๋ก ํด๋์ค๋ฅผ ์ฝ์ด๋ค์ด๋ ๋ฐฉ๋ฒ์ BCITestํด๋์ค์์ ClassReader์์ฑํ ๋ ์ด๋ฆ์ ์ฃผ๋ ๋ฐฉ๋ฒ ์ธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
์ฌ ์ฉ์ ๋ฉ๋ด์ผ์๋ ์๋์ ๊ฐ์ด ์ค๋ช ์ด ๋์ด์์ต๋๋ค. ์ด๋ฆ, ๊ฐ, byte array, input stream์ ์ด์ฉํด์ ์ฝ์ด๋ค์ผ ์ ์๋๋ฐ input stream์ ์ด์ฉํด์ ํด๋์ค๋ฅผ ์ฝ์ด๋ค์ผ ๋๋ ํด๋์ค ๋ก๋์ getResourceAsStream ๋ฉ์๋๋ฅผ ์ด์ฉํ ์ ์๋ค๊ณ ํฉ๋๋ค. ์ฌ์ฉ ์์ ๊ฐ ๋ฐ๋ก ๋ฐ์ ๋์์์ฃ ?
The class that must be read can be specified by name, as above, or by value, as a byte array or as an InputStream. An input stream to read the content of a class can be obtained with the ClassLoaderโs getResourceAsStream method with:
cl.getResourceAsStream(classname.replace(โ.โ, โ/โ) + ".class");
์, ํด๋์ค ํ์ผ ์ฝ๊ธฐ๋ ์ด์ฏค์์ ๋๋ด๊ฒ ์ต๋๋ค. ์ค๋ช ์ด ๊ธธ๋ฉด ๋จธ๋ฆฌ๋ง ์ํ์ฃ .
๋ค์ ์๊ฐ์๋ ๊ธฐ์กด์ ํด๋์ค๋ฅผ ์ฝ๋๊ฒ์ด ์๋๋ผ ํด๋์ค๋ฅผ ์์ฑํด๋ณด๋๋ก ํด๋ณด๊ฒ ์ต๋๋ค~
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ์ ์ด๋ง~
์ถ์ฒ : ASM 4 ์ฌ์ฉ์ ๊ฐ์ด๋ ( ํ ์คํธ๋ ASM 5 ๋ก ํ์ต๋๋ค. )