지난 리플렉션 시간에 이어서 리플렉션을 활용하여 Spring의 DI(Dependency Injection)을 약간 비슷하게 따라 해 보겠습니다. 일단 DI를 쓸 때, 주로 Annotation을 사용합니다. 그래서 이 애노테이션을 활용하여, DI를 구현하려고 합니다. Annotation에 관하여 살펴보겠습니다. 프로젝트는 저번 시간(리플렉션)에 이어서 진행합니다. package me.whiteship; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; public @interface MyAnnotation { } Annotation을 생성합니다. package me.whiteship; @MyAnnotatio..
리플렉션(Reflection)이란? 리플렉션은 구체적인 클래스 타입을 알지 못하여도, 해당 클래스의 메소드, 타입, 필드(변수)들을 접근할 수 있도록 해주는 자바 API 입니다. https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html 먼저 리플렉션을 실습할 프로젝트를 생성해보겠습니다. package me.whiteship; public class Book { private String a = "a"; private static String B = "BOOK"; private static final String C = "BOOK"; public String d = "d"; protected String e = "e"; public Book() { }..
JVM 구조에 대한 글에서 살펴보았듯이 .java 파일을 자바가 컴파일하여, .class 파일로 변환하고 .class 파일을 JVM이 클래스 로더에 의해서 로딩 -> 링크 -> 초기화 작업을 통하여 메모리(Runtime Data Area)에 저장하게 됩니다. 바이트 코드 조작은 개발자의 소스코드(.java)를 직접 수정하지 않고 .class 파일을 수정하여 원하는 기능 구현하는 장점이 있습니다. 그럼 바이트 코드를 조작하여 활용하는 예시를 살펴보겠습니다. 1. 프로그램 분석 코드에서 버그 찾는 툴 코드 복잡도 계산 2. 클래스 파일 생성 프록시 (원래 소스 코드 대신 실행할 코드) 특정 API 호출 접근 제한 스칼라 같은 언어의 컴파일러 3. 그 밖에도 자바 소스 코드 건드리지 않고 코드 변경이 필요한 ..
일단 바이트 코드 조작의 대표적인 예를 보면서 차근차근 살펴보겠습니다. 코드 커버리지(Code Coverage)는 어떻게 측정하는 걸까? 코드 커버리지란? 소프트웨어의 테스트 케이스가 얼마나 충족되었는지를 나타내는 지표 중 하나입니다. 테스트를 진행하였을 때 테스트 코드가 얼마나 실행되었는지를 수치화하여 확인할 수도 있습니다. 이제 코드 커버리지가 어떻게 보이는지 예제를 통해 살펴보겠습니다. 우선 프로젝트 생성하기 전에 현재 개발환경을 적어 놓겠습니다. IDE : 인텔리제이 / 운영체제 : Mac OS / Java Version : 11 그럼 프로젝트 생성을 해보겠습니다. 새 프로젝트 생성 시 Maven을 클릭합니다. Create from archetype 체크박스 클릭을 합니다. 그리고 maven-ar..
위 사진은 JVM의 전체적인 구조입니다. 클래스 로더(Class Loader) 자바 바이트 코드를 읽어서 JVM의 실행 엔진이 사용할 수 있도록 메모리의 메소드 영역에 적재하는 역할을 합니다. 로딩 -> 링크 -> 초기화 순으로 진행됩니다. 1. 로딩 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고, 메소드 영역에 저장됩니다. 이때 메소드 영역에 저장하는 데이터는 다음과 같습니다. FQCN(Fully-Quailified Class Name) : 클래스 로더, 클래스 패키지 경로, 패키지 이름, 클래스 이름을 모두 포함한 값 Class, Interface, Enum 메소드와 변수 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장하게 됩니다...
JVM (Java Virtual Machine) 자바 가상 머신으로 자바 바이트 코드(.class)를 운영체제(OS)가 실행할 수 있는 네이티브 코드로 변환(Interpreter, JIT Compiler) 하여 실행 합니다. 해당 운영체제에 맞는 네이티브 코드로 바꿔서 실행해야 하므로, JVM은 특정 플랫폼에 종속적이며, JVM은 자바(JAVA)와 운영체제 사이에서 중개하는 역할을 수행하기 때문에 자바가 운영체제에 신경 쓸 필요 없이 재사용이 가능하도록 해줍니다. JVM은 바이트 코드를 실행하는 표준 스펙(JVM)이자 구현체(특정 밴더가 구현한 JVM)입니다. JVM 벤더로는 Oracle, Amazon, Adoptium, Azul 등 여러 벤더들이 있습니다. JVM의 자세한 스펙은 https://docs..
- Total
- Today
- Yesterday
- 프록시패턴
- Java Reflection
- 실행 엔진
- jvm
- dromos
- 코드 커버리지
- 깃 기초
- JRE와 JDK의 차이점
- 자바 프록시 패턴
- java11 optional
- java proxy pattern
- javaagent
- java
- JVM 구조
- Reflection
- java abstractprocessor
- classloder
- 애노테이션
- 클래스로더
- 바이트 코드
- bytebuddy
- Annotation Processor
- 자바 리플렉션
- 애노테이션 프로세서
- 리플렉션
- javassist
- optional api
- java optional
- 람다표현식
- Functional Interface
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |