0Pricing
Java Academy · 강의

메서드 호출과 필드 접근

Method.invoke와 Field.set을 setAccessible과 함께 사용해 private 메서드를 호출하고 접근할 수 없는 필드를 설정합니다.

메서드 호출과 필드 접근은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

setAccessible: 가시성 우회하기

field.setAccessible(true) 또는 method.setAccessible(true)을 호출하여 Java의 접근 제어를 우회합니다. 비공개 멤버에 필요하며, Java 9 이상에서는 적절한 모듈 접근 권한도 필요합니다.

Field f = User.class.getDeclaredField("name");
f.setAccessible(true);
User u = new User("Alice", 30);
System.out.println(f.get(u));  // "Alice"
f.set(u, "Bob");               // mutate the private field
System.out.println(u.getName()); // "Bob"

필드 값 읽기

field.get(instance)를 사용하여 모든 필드 값을 읽습니다(기본 타입은 래퍼 객체로 변환됩니다). 정적 필드에는 인스턴스로 null을 전달하십시오.

Field f = MyClass.class.getDeclaredField("count");
f.setAccessible(true);
int count = (int) f.get(null); // static field → null instance

필드 값 설정하기

field.set(instance, value)를 사용하여 필드에 값을 씁니다. 값의 타입은 필드와 일치하거나 자동으로 언박싱될 수 있어야 합니다. 최신 JVM에서 리플렉션으로 final 필드를 설정하면 동작이 정의되지 않습니다.

Field nameField = User.class.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(user, "Charlie");

리플렉션으로 메서드 호출하기

Method 객체를 가져오고 setAccessible(true)을 호출한 다음 method.invoke(instance, args...)로 메서드를 호출합니다. 반환 값은 Object입니다.

Method greet = User.class.getDeclaredMethod("greet", String.class);
greet.setAccessible(true);
String result = (String) greet.invoke(user, "World");
System.out.println(result);

InvocationTargetException 처리하기

호출한 메서드에서 예외가 발생하면 리플렉션은 이를 InvocationTargetException으로 감쌉니다. getCause()로 원래 예외를 꺼내십시오.

try {
    method.invoke(obj, args);
} catch (InvocationTargetException e) {
    Throwable cause = e.getCause();
    System.err.println("Method threw: " + cause.getMessage());
} catch (IllegalAccessException | NoSuchMethodException e) {
    System.err.println("Reflection error: " + e.getMessage());
}

정적 메서드 호출하기

정적 메서드를 호출할 때 인스턴스 인수로 null을 전달하십시오.

Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
int value = (int) parseInt.invoke(null, "42"); // null = static
System.out.println(value); // 42

생성자로 인스턴스 생성하기

Constructor를 가져오고, 비공개 생성자라면 setAccessible(true)을 호출한 다음 newInstance(args...)를 호출합니다.

Constructor<User> ctor = User.class.getDeclaredConstructor(String.class, int.class);
ctor.setAccessible(true);
User u = ctor.newInstance("Diana", 28);
System.out.println(u);

프레임워크의 리플렉션: Spring DI

Spring은 리플렉션을 사용하여 빈을 인스턴스화하고 의존성을 주입합니다. 비공개 생성자를 호출하고 비공개 필드를 설정하여 애플리케이션 컨텍스트를 연결합니다.

Java 9 이상의 모듈 접근

Java 9 이상에서는 모듈이 기본적으로 setAccessible을 제한합니다. 클래스가 이름이 지정된 모듈에 있다면 패키지를 열어야 할 수 있습니다: --add-opens java.base/java.lang=ALL-UNNAMED.

// JVM flag to open a package for reflection:
// --add-opens java.base/java.lang=ALL-UNNAMED

더 빠른 대안으로서의 MethodHandles

MethodHandles.lookup().findVirtual()은 JIT 최적화 후 직접 호출에 가까운 성능으로 리플렉션을 통한 메서드 호출을 제공합니다. 성능이 중요한 라이브러리 코드에 권장됩니다.

MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(User.class, MethodHandles.lookup());
MethodHandle handle = lookup.findVirtual(User.class, "getName", MethodType.methodType(String.class));
String name = (String) handle.invoke(user);

리플렉션 모범 사례

Field/Method 객체를 캐시하십시오. 실행 빈도가 높은 반복문에서 객체를 가져오지 마십시오. 리플렉션을 서비스 클래스로 감싸고, 성능을 위해 MethodHandles를 고려하십시오. 가능하면 리플렉션보다 인터페이스를 우선하십시오.

빠른 확인

리플렉션으로 호출한 메서드에서 예외가 발생하면 어떤 예외가 원인을 감쌉니까?

복습

setAccessible(true)을 사용하여 비공개 멤버에 접근합니다. method.invoke()로 메서드를 호출하고, InvocationTargetException에서 원래 예외를 꺼냅니다. 리플렉션 객체를 캐시하고, 실행 빈도가 높은 경로에는 MethodHandles를 우선 사용하십시오.

자주 묻는 질문

“메서드 호출과 필드 접근” 강의는 무료인가요?

네 — “메서드 호출과 필드 접근” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“메서드 호출과 필드 접근”에서 뭘 배우나요?

Method.invoke와 Field.set을 setAccessible과 함께 사용해 private 메서드를 호출하고 접근할 수 없는 필드를 설정합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“메서드 호출과 필드 접근” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 리플렉션을 사용한 클래스 검사
  2. 메서드 호출과 필드 접근
  3. InvocationHandler를 사용한 동적 프록시
  4. 리플렉션 성능과 대안
← Java Academy(으)로 돌아가기