본문 바로가기

Category

(258)
개발 진행 : 메서드 변조(MethodVisitor, ClassVisitor), 로깅 PrepareStatement Searchtransformer를 통해 prepareStatement를 조회해보자.public class MyClassTransformer implements ClassFileTransformer { //이 인터페이스의 구현체(transform)은 JVM이 존재하는 클래스를 로드할 때마다 호출되며, 이 시점에서 바이트코드를 조사하고 변경할 수 있다. @Override public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfi..
Config properties 생성 및 ClassPath 파일 설정 정보 읽기 IntelliJ IDEA에서는 기본적으로 src/main/resources 폴더를 클래스패스에 포함시킨다. 그러므로 설정 파일을 src/main/resources 폴더에 두고 클래스패스 아래에 포함시키자. Config 읽는 예제 코드 작성 package org.agent.util.init;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class Config { public void loadProperties() { try (InputStream inpu..
[JVM] 실행 엔진(Execution Engine)과 JIT, 인터프리터 참조 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-JVM-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-%EC%8B%AC%ED%99%94%ED%8E%B8 ☕ JVM 내부 구조 & 메모리 영역 💯 총정리저번 포스팅에서는 JRE / JDK / JVM에 대해서 간략하게 알아보는 시간을 가졌다면, 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 할 예정이다. JVM(자바 가상 머신)은 자바 언inpa.tistory.com https://coding-factory.tistory.com/828 [Java] 자바 JVM 내부 구조와 메모리 구조에 ..
[A Java bytecode engineering library] - [Core API] 3. Method[2/3] 개인 요약 및 정리Overview3장 2절은 클래스 멤버(필드, 메서드 등)의 변형, 추가, 제거 방법을 다룬다. 이 과정에서 ClassVisitor와 MethodVisitor 인터페이스의 활용이 중요하다. 여기서는 간단한 변형부터 복잡한 변형까지 다양한 예시를 통해 ASM 라이브러리의 활용 방법을 설명한다. 멤버 제거필드와 메서드 제거: 특정 조건에 부합하는 필드나 메서드를 찾아 제거합니다. 이를 위해 visitField와 visitMethod 메서드를 오버라이드하고, 조건에 맞지 않는 경우 해당 호출을 전달하지 않습니다(null 반환).멤버 추가필드와 메서드 추가: 새로운 필드나 메서드를 추가하려면, visitField나 visitMethod를 적절한 시점에 호출합니다. 특히, visitEnd 메서드..
[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, ..
[TroubleShooting]Instrument API, ClassFileTransformer에서 Spring Server Class Scan 불가 장장 10시간의 트러블슈팅 과정을 서술하였다.개요 1. premain에서 내가 만든 ClassTransFormer 구현체를 생성하고, @Transform에서 이 Agent가 설치된 서버의 Class를 읽어오는 목표를 세웠다. 처음에 확인 차 모든 'transform'마다 print를 통해 className을 출력하게 하였다. 2. 이 서버는 Springboot인데, src/main/java 내부의 모든 Class가 스캔되지 않는 문제가 발생했다. spring 어노테이션이 달리지 않은 일반 Class 파일이 1의 과정에서 출력되지 않는다. 3. 하지만 해당 클래스 파일에 @Configuration의 어노테이션을 붙이면 1의 과정에서 정상적으로 출력된다. 그러나 이렇게 진행할 경우 서버 빌드 과정에서 에..
[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. Tasm.ow2.io 전체 메서드들..
[ASM] static과 인스턴스 필드 생성자 호출 - <clinit>, <init> : 정적 초기화 생성자 블록, : 생성자 호출 블록변수를 만드는 것과, 생성자를 불러서 초기 값을 지정하는 것은 다른 프로세스이다. asm으로 변수를 생성하는 것과는 별개로, clinit과 init 호출을 통해 이것의 생성자를 mv으로 호출하고, 이 생성자들을 통해 값을 넣어줄 수 있다 clinit과 init은 Java 바이트코드에서 특별한 의미를 가지는 메서드 이름이다.이들은 클래스 단위로 작동하며, 특정 객체 인스턴스에 대한 것이 아니다. 이 메서드를 통해 정의된 코드는 클래스가 JVM에 의해 로딩되는 시점에 한 번만 실행된다. : static에서의 생성자 호출 는 Java 클래스의 정적 초기화 블록(static initializer block)에 해당하는 특별한 메서드이다. Java에서 정적 초..