리플렉션과 구성
동적 기능을 처리합니다
리플렉션과 구성은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
리플렉션과 구성
네이티브 이미지의 폐쇄 세계 분석은 정적으로 추적할 수 있는 코드만 확인할 수 있습니다. 리플렉션, 프록시, 리소스, 직렬화 같은 동적 기능은 분석기에서 대상이 보이지 않게 만듭니다. 이 레슨에서는 이러한 기능이 네이티브 바이너리에서 작동하도록 만드는 방법을 설명합니다.
리플렉션의 문제
문자열로 클래스 이름을 조회하면 분석기는 어떤 클래스를 의미하는지 알 수 없습니다. 해당 클래스에 다른 경로로 도달할 수 없다면 이미지에서 제외되고, 실행 시 조회가 실패합니다.
public class Main {
public static void main(String[] args) throws Exception {
String name = "java.util.ArrayList"; // could come from config
Class<?> c = Class.forName(name);
System.out.println("Loaded: " + c.getSimpleName());
}
}도달 가능성 메타데이터
해결 방법은 도달 가능성 메타데이터입니다. 이는 어떤 클래스, 메서드, 필드가 동적으로 접근되는지 네이티브 이미지에 알려 주는 JSON 파일입니다. 그러면 빌드 과정에서 해당 항목을 유지하고 구성원을 기록합니다.
reflect-config.json
리플렉션 항목에는 클래스와 유지할 구성원이 지정됩니다. 이 내용은 Java가 아니라 JSON이며, META-INF/native-image/ 아래에 저장됩니다.
[
{
"name": "com.example.Person",
"allDeclaredConstructors": true,
"allDeclaredMethods": true,
"fields": [ { "name": "age" } ]
}
]추적 에이전트
메타데이터를 직접 작성하는 일은 번거롭습니다. 추적 에이전트와 함께 JVM에서 애플리케이션을 실행하십시오(-agentlib:native-image-agent=config-output-dir=...). 추적 에이전트는 실제 실행 중 발생하는 모든 동적 접근을 기록하고 구성 파일을 자동으로 생성합니다.
코드 경로 실행하기
에이전트는 실제로 실행되는 항목만 기록하므로, 애플리케이션의 모든 기능을 실행해 보아야 합니다. 에이전트가 활성화된 상태에서 테스트를 실행하십시오. 놓친 리플렉션 경로는 메타데이터에 포함되지 않아 네이티브 빌드에서 오류를 일으킵니다.
동적 프록시
JDK 동적 프록시에는 프록시로 사용되는 인터페이스 집합을 나열한 proxy-config.json이 필요합니다. 인터페이스 목록이 실행 중에 구성되므로 분석기는 이를 추론할 수 없습니다.
리소스
getResourceAsStream을 통해 불러오는 파일은 자동으로 포함되지 않습니다. 글로브 패턴이 포함된 resource-config.json을 사용하면 실행 파일에 포함할 리소스를 네이티브 이미지에 알려 줄 수 있습니다.
public class Main {
public static void main(String[] args) {
var url = Main.class.getResource("/banner.txt");
System.out.println("Resource present: " + (url != null));
}
}직렬화와 JNI
Java 직렬화와 네이티브(JNI) 호출도 동적으로 처리됩니다. 각각 고유한 구성 파일(serialization-config.json, jni-config.json)을 사용합니다. 해당 경로가 실행되면 추적 에이전트가 이 파일들도 생성합니다.
프로그래밍 방식 등록
라이브러리 개발자는 빌드 시점에 실행되는 RuntimeReflection 인터페이스를 통해 Feature를 사용하여 코드에서 메타데이터를 등록할 수 있습니다. 이렇게 하면 올바른 구성이 라이브러리 내부에 포함되므로 사용자가 직접 설정할 필요가 없습니다.
공유 메타데이터 저장소
GraalVM은 널리 사용되는 라이브러리를 위한 사전 구성 파일을 제공하는 커뮤니티 도달 가능성 메타데이터 저장소를 관리합니다. 네이티브 빌드 도구가 이를 자동으로 가져올 수 있으므로, 일반적인 프레임워크를 별도 설정 없이 사용할 수 있습니다.
빠른 확인
네이티브 이미지의 동적 기능을 제대로 이해했는지 테스트해 보십시오.
복습
동적 기능을 처리하는 방법을 배웠습니다.
- 리플렉션, 프록시, 리소스, 직렬화, JNI는 정적 분석에서 보이지 않습니다.
- 도달 가능성 메타데이터 JSON 파일은 이러한 항목을 네이티브 이미지에 선언합니다.
- 추적 에이전트는 실제 JVM 실행에서 구성을 자동으로 생성합니다.
- 빠지는 항목이 없도록 모든 코드 경로, 특히 테스트를 실행하십시오.
- 널리 사용되는 라이브러리에는 공유 메타데이터 저장소를 사용하십시오.
자주 묻는 질문
“리플렉션과 구성” 강의는 무료인가요?
네 — “리플렉션과 구성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“리플렉션과 구성”에서 뭘 배우나요?
동적 기능을 처리합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“리플렉션과 구성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.