일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 보안
- 자바
- 장고
- Python
- rabbitmq
- JPA
- 파이썬
- Spring
- 스프링 부트
- 개발
- 파이썬3
- python3
- 자료구조
- 안드로이드
- 스프링부트
- 웹
- node.js
- BCI
- 스프링
- django
- db
- 디자인 패턴
- mysql
- Spring Boot
- 웹 개발
- ORM
- java
- bytecode
- HTTP
- 데이터베이스
- Today
- Total
목록BCI (7)
semtax의 개발 일지
1. Tree API를 이용한 메서드 조작 ASM에서 제공하는 MethodNode는 대략적으로 아래와 같이 생겼습니다. public class MethodNode ... { public int access; public String name; public String desc; public String signature; public List exceptions; public List visibleAnnotations; public List invisibleAnnotations; public List attrs; public Object annotationDefault; public List[] visibleParameterAnnotations; public List[] invisibleParameter..
1. Tree API 이번 포스팅에서는 ASM에서 제공하는 Tree API를 이용해서, 클래스 파일을 조작해보도록 하겠습니다. ASM에서는 클래스 조작을 위한 Tree API인 ClassNode 클래스를 제공합니다. 대략적인 생김새는 아래와 같습니다. public class ClassNode ... { public int version; public int access; public String name; public String signature; public String superName; public List interfaces; public String sourceFile; public String sourceDebug; public String outerClass; public String ou..
1. 자바 제네릭(Generic) & 타입구조 소개 사실 자바 제네릭은, 초창기 자바에는 존재하지 않는 문법이었다. 그래서 타입이나 메서드 정보와 문법적으로 흡사함에도 불구하고, 해당영역이 아닌, 별도의 다른영역에 저장된다. 또한 제네릭같은경우 실제 실행되는 바이트코드에는 영향을 미치지 않기 때문에 별도의 영역에 저장을 해도 따로 문제가 생기지는 않는다. 자바 스펙문서상에서 제네릭의 문법은 아래와 같은 EBNF(Extended Bacus-Naur Form)으로 정의되어있다. 문법의 정의가 꽤나 복잡하다는것을 알 수 있다. TypeSignature: Z | C | B | S | I | F | J | D | FieldTypeSignature FieldTypeSignature : ClassTypeSignatu..
1. JVM은 어떻게 클래스 파일을 실행하는가? 일단 자바가 어떠한 방식으로 컴파일된 클래스 파일을 실행하는지 알아보자. 먼저, JVM(자바 가상 머신)이 컴파일된 클래스파일을 읽어서 메모리에 로딩을 한다. 그 다음에, JVM이 클래스 파일에 있는 바이트코드를 순차적으로 읽으면서 그에 맞는 동작을 수행한다(사실 요즘에는 JVM이 속도를 위해서 자주 사용하는 부분을 파악해서 Just in time 방식을 이용해서 해당 부분을 미리 Native Code로 변환을 해서 실행을 한다). 이때 자바에서는 이러한 바이트코드들을 실행하는 기본 단위가 스레드(Thread)이다. 또한, 자바에서는 각 스레드 별로 Execution Stack(JVM Stack)을 1개씩 가지고 있다. 또한 각 스레드에서 함수를 호출할시 ..
1. 자바 클래스 구조 1-1. 자바 클래스 전체 구조 컴파일된 자바 클래스의 개략적인 구조는 아래와 같이 구성되어있다. 클래스 메타정보 버전, 식별자 등 소스파일 이름 상속관련 정보들 클래스 접근자에 대한 정보 클래스 내에 선언된 필드들의 목록 메서드와 생성자들의 목록 어노테이션 정보 상수 목록들(Constant Pool) 바이트 코드 내부 클래스 정보 그림으로 나타내면 아래와 같다. 1-2. Internal Name 컴파일된 클래스에서, 클래스 이름들은 소스코드와는 다르게 내부적으로 "java/lang/String"과 같은식으로 사용이 된다. 이를 Internal Name이라고 부른다. 참고로, 자바의 Class 클래스를 이용해서 해당 이름을 얻어올 수 있다. 1-3. 타입 및 메서드 명명 규칙 컴파..
자바 시스템 클래스 들을 ASM으로 변경하는법 아래와 같이 자기가 직접 정의된 클래스 로더를 만들어서 수행하면 된다. 대충 순서는 다음과 같다. ClassLoader와 Class 클래스를 이용해서 변경하려는 클래스를 읽어 옴 setAccessible함수를 이용해서 권한을 수정가능한 상태로 변경함 reflection을 이용해서 ClassLoader.defineClass 을 호출하여 변경하려는 클래스에 접근 접근한 클래스를 변경후 반환 아래는 예제 코드이다. private Class loadClass(byte[] b) { // Override defineClass (as it is protected) and define the class. Class clazz = null; try { ClassLoader ..
1. ASM을 어디에다 쓰는가? 난독화 도구 제작등에도 사용 됨. JIT만들때도 활용이 가능 함. 그 외 기존 class 파일의 바이트 코드 패치를 할때 사용 됨. AspectJ 같은데서도 쓰인다고 함 2. ASM 라이브러리의 전체적인 구조 2-1. 전체 구성 Tree Based API와 Event Based API를 제공함 Tree Based API는 Top-Down으로 자바 바이트 코드를 파싱하여 생성된 AST를 순회하는 방식으로 동작 Event Based API는 순차적으로 바이트코드를 읽어들어서 특정 구문이 발견되었을때(Ex: 클래스 정의, 변수선언 등) 해당 구문이 발생하면 이벤트 핸들러가 실행되는 방식임 2-2. 주요 모듈 org.objectweb.asm : 이벤트 based API를 제공 o..