본문 바로가기

Java/공부공부

[JAVA] 리플렉션 (Relection)

 

자바 프로그램이 실행 중에 클래스, 인터페이스, 메소드, 필드 등의 정보를 동적으로 탐색하고 조작할 수 있는 기능.

주로 프레임워크나 라이브러리에서 사용. 

 

 

[ Class 클래스 ]

자바에서 모든 클래스와 인터페이스의 메타데이터를 표현하는 클래스.

클래스 이름, 상속 관계, 인터페이스 구현 여부 등

 

(메소드)

 - getName() : 클래스의 전체 이름(패키지 포함)을 반환.

 - getSimpleName() : 클래스의 이름(패키지 제외)을 반환.

 - getSuperclass() : 부모 클래스의 class 객체를 반환.

 - getInterfaces() : 클래스가 구현하는 인터페이스의 배열을 반환.

 - getSDeclaredFields(), getDeclaredMethods(), getDeclaredConstructors() :

     클래스에 선언된 모든 필드, 메소드, 생성자의 정보를 배열로 반환.

 

Class<?> clazz = MyClass.class;
System.out.println("클래스 이름: " + clazz.getName());

 


 

[ Constructor 클래스 ]

특정 클래스의 생성자를 나타내며, 해당 생성자에 접근하고 객체를 생성할 수 있음.

 

(메소드)

 - newInstance(Object... initargs) : 해당 생성자를 사용해 객체를 생성.

            ** initargs 배열에 전달된 값들을 해당 생성자의 인자로 사용하여 새 객체를 생성.

 - getParameterTypes() : 생성자의 파라미터 타입들을 배열로 반환.

 - setAccessible(boolean flag) : private 생성자에 접근할 수 있도록 설정.

 

Constructor<?> constructor = MyClass.class.getDeclaredConstructor(String.class);
constructor.setAccessible(true); // private 생성자에 접근 허용
Object obj = constructor.newInstance("파라미터 값");

 



[ Field 클래스 ]

특정 클래스의 필드(멤버 변수)를 나타내며, 해당 필드에 접근하고 값을 가져오거나 설정할 수 있음.

 

(메소드)

 - get(Object obj) : 지정한 객체의 필드 값을 반환.

 - set(Object obj, object value) : 지정한 객체의 필드 값을 변경.

 - getType() : 필드의 타입을 반환.

 - setAccessible(boolean flag) : private 필드에 접근할 수 있도록 설정.

 

Field field = MyClass.class.getDeclaredField("name");
field.setAccessible(true); // private 필드 접근 허용
String value = (String) field.get(obj);
field.set(obj, "새로운 값");

 


 

[ Method 클래스 ]

특정 클래스의 메소드를 나타내며, 해당 메소드에 접근하고 호출할 수 있음.

 

(메소드)

 - invoke(Object obj, object... args) : 지정한 객체에서 해당 메소드를 호출.

 - getReturnType() : 메소드의 반환 타입을 반환.

 - getParameterTypes() : 메소드의 파라미터 타입을 배열로 반환.

 - setAccessible(boolean flag) : private 메소드에 접근할 수 있도록 설정.

 

Method method = MyClass.class.getDeclaredMethod("sayHello", String.class);
method.setAccessible(true); // private 메소드 접근 허용
String result = (String) method.invoke(obj, "안녕하세요");