본문 바로가기

기술스택

(19)
[A Java bytecode engineering library] - [Core API] 3. Method[3/3] 3.3. 도구들 (tools) org.objectweb.asm.commons 패키지에는 자신만의 어댑터를 정의하는데 유용할 수 있는 몇 가지 사전 정의된 메소드 어댑터들이 포함되어 있다. 이 섹션에서는 그 중 세 가지를 소개하고, 이들이 어떻게 섹션 3.2.4의 AddTimerAdapter 예제와 함께 사용될 수 있는지 보여준다. 또한, 이전 장에서 본 도구들이 메소드 생성이나 변환을 용이하게 하는 방법도 보여준다. 3.3.1. 기본 도구들 섹션 2.3에서 소개된 도구들은 메소드에도 사용될 수 있다. 타입(Type) 많은 바이트코드 명령어들, 예를 들어 xLOAD, xADD 또는 xRETURN은 적용되는 타입에 따라 다르다. Type 클래스는 이러한 명령어들에 대해, 주어진 타입에 해당하는 opcode를..
[ASM]]MethodVisitor를 통해 특정 메서드 변조하기 나는 m의 메서드를 찾아, 여기 sysout을 통해 로깅을 붙이고 싶다..! 바로 코드를 보자. (A)의 경우 정상적인 동작을 하고, (B)의 경우 잘못된 코드이다. public class WrappingMethodVisitor extends ClassVisitor { public WrappingMethodVisitor(ClassVisitor classVisitor) { super(Opcodes.ASM9, classVisitor); } //각 메서드 방문시 호출 @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor m..
[ASM] static과 인스턴스 필드 생성자 호출 - <clinit>, <init> : 정적 초기화 생성자 블록, : 생성자 호출 블록 변수를 만드는 것과, 생성자를 불러서 초기 값을 지정하는 것은 다른 프로세스이다. 쉽게 말해서 Obj obj; 와 Obj obj = new Obj(); 은 JVM 동작 자체가 다르다. asm으로 변수를 생성하는 것과는 별개로, clinit과 init 호출을 통해 이것의 생성자를 mv으로 호출하고, 이 생성자들을 통해 값을 넣어줄 수 있다 clinit과 init은 Java 바이트코드에서 특별한 의미를 가지는 메서드 이름이다. 이들은 클래스 단위로 작동하며, 특정 객체 인스턴스에 대한 것이 아니다. 이 메서드를 통해 정의된 코드는 클래스가 JVM에 의해 로딩되는 시점에 한 번만 실행된다. : static에서의 생성자 호출 는 Java 클래스의 정적 초기화 ..
[ASM Docs]MethodVisitor 하위 메서드들 Docs를 통해 알아보기 https://asm.ow2.io/javadoc/org/objectweb/asm/MethodVisitor.html#visitParameter(java.lang.String,int) MethodVisitor (ASM 9.6) Direct Known Subclasses: AnalyzerAdapter, CheckMethodAdapter, CodeSizeEvaluator, InstructionAdapter, LocalVariablesSorter, MethodNode, MethodRemapper, TraceMethodVisitor public abstract class MethodVisitor extends Object A visitor to visit a Java method. T asm.ow2.io 전체 메서..
[ASM 바이트코드 작성] if문과 예외를 포함한 메서드 추가 예제(중요) 예제 코드 package org.agent.util.asm.testcode.chap03; import org.objectweb.asm.*; import static org.objectweb.asm.Opcodes.*; public class SetF extends ClassVisitor { public SetF(ClassVisitor classVisitor) { super(Opcodes.ASM9, classVisitor); } @Override public MethodVisitor visitMethod( final int access, final String name, final String descriptor, final String signature, final String[] exceptions) {..
[A Java bytecode engineering library] - [Core API] 3. Method[2/3] 개인 요약 및 정리 Overview 3장 2절은 클래스 멤버(필드, 메서드 등)의 변형, 추가, 제거 방법을 다룬다. 이 과정에서 ClassVisitor와 MethodVisitor 인터페이스의 활용이 중요하다. 여기서는 간단한 변형부터 복잡한 변형까지 다양한 예시를 통해 ASM 라이브러리의 활용 방법을 설명한다. 멤버 제거 필드와 메서드 제거: 특정 조건에 부합하는 필드나 메서드를 찾아 제거합니다. 이를 위해 visitField와 visitMethod 메서드를 오버라이드하고, 조건에 맞지 않는 경우 해당 호출을 전달하지 않습니다(null 반환). 멤버 추가 필드와 메서드 추가: 새로운 필드나 메서드를 추가하려면, visitField나 visitMethod를 적절한 시점에 호출합니다. 특히, visitEn..
[Agent / ASM] agent의 transform 메서드에 ASM 바이트코드 적용하기 1 ClassReader - ClassWriter - ClassVisitor의 관계 먼저 이전 시간에 학습했던 내용을 다시 되짚으려고 한다. 1. ClassReader ClassReader는 주어진 바이트 배열(byte[])로부터 클래스 정보를 읽는 역할을 한다. 즉, .class 파일이나 ClassFileTransformer 인터페이스를 통해 전달받은 바이트코드(중요)를 읽고 해석하는 데 사용된다. ClassReader는 클래스 파일의 구조를 순차적으로 읽지만, 직접 바이트코드를 수정하지는 않는다. 대신, 읽어들인 정보를 ClassVisitor에 전달하여 분석이나 조작을 가능하게 한다. 2. ClassWriter ClassReader로부터 읽거나 새로운 정보를 바탕으로, 새로운 바이트코드를 만들거나 기존 ..
[A Java bytecode engineering library] - [Tree API] 7. Method 개인 학습 정리MethodNodepublic class MethodNode extends MethodVisitor { public int access; // 메서드의 접근 제어자. 예: ACC_PUBLIC, ACC_PRIVATE 등 public String name; // 메서드 이름 public String desc; // 메서드 서술자(descriptor). 매개변수와 반환 타입 포함 public String signature; // 메서드 시그니처. 제네릭 정보 포함 public List exceptions; // 메서드가 던질 수 있는 예외 타입 목록 public List parameters; // 메서드 매개변수 목록 public List visibleAnnotations; // 런타임에서 보이..