본문 바로가기

전체 글

(215)
[디자인 패턴]방문자(visitor) 패턴 설명과 예 설명 방문자 패턴은 알고리즘들을 그들이 작동하는 객체들로부터 분리할 수 있도록 하는 행동 디자인 패턴이다. 방문자(Visitor) 패턴은 객체 지향 디자인 패턴의 하나로, 알고리즘을 객체 구조에서 분리하여, 객체 구조의 클래스를 변경하지 않고도 새로운 연산을 추가할 수 있도록 한다. 이 패턴은 객체 구조 내의 각 요소에 대해 수행할 연산을 별도의 '방문자' 객체에 정의한다. 연산을 추가하는 것이 객체 구조의 클래스들을 변경하는 것보다 훨씬 용이하기 때문이다. 특히, 복잡한 객체 구조를 다룰 때 유용하며, 다양한 연산을 객체 구조에 추가하고자 할 때 활용된다. 내가 직접적으로 느꼈던 직관적인 설명을 서술하자면, "일반적인 로직과 달리 방문자가 로직을 가지고 accept를 통해 파라미터로 받는 방문자 객체에..
[디자인 패턴]어댑터(apdapter) 패턴 설명과 예시 https://refactoring.guru/ko/design-patterns/adapter 어댑터 패턴 / 디자인 패턴들 / 구조 패턴 어댑터 패턴 다음 이름으로도 불립니다: 래퍼(Wrapper), Adapter 의도 어댑터는 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴 refactoring.guru 설명 기존 클래스를 사용하고 싶지만 그 인터페이스가 나머지 코드와 호환되지 않을 때 사용 어댑터 패턴은 구조적 디자인 패턴의 일종으로, 호환되지 않는 인터페이스로 인해 함께 사용할 수 없는 클래스들이 서로 상호 작용할 수 있도록 해준다. 이 패턴은 기존 시스템에 새로운 클래스를 쉽게 통합하고자 할 때 유용하게 사용된다. 어댑터 패턴의 주요 목적은 기능의 재사용과 코드..
[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..