✔️ 리플렉션
리플렉션이란?
- 이미 로딩이 완료된 클래스에서 또는 다른 클래스를 동적으로 로딩하여 구체적인 타입을 알지 못하더라도
생성자, 멤버 필드, 그리고 멤버 메소드를 사용할 수 있는 기법 - 즉, 런타임에 동적으로 특정 클래스의 정보를 객체화하여 분석 및 추출해낼 수 있음
- 객체를 통해서 클래스의 패키지 정보, 접근 지정자, 부모 클래스, 어노테이션 등을 얻을 수 있음
- 실행 시간에 다른 클래스를 동적으로 로딩하여 접근할 필요가 있을 때 사용
- 하지만 외부에 공개되지 않은 private 멤버도 메소드를 통해 지정할 경우 접근과 조작이 가능하기 때문에 주의해서 사용해야 함
- 또한 리플렉션은 동적으로 해석되는 유형이 포함되어 특정 JVM 최적화를 수행할 수 없어 성능이 떨어지므로
성능에 민감한 애플리케이션에서 자주 호출되는 코드에는 사용하지 않아야 함
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class ReflectionTest {
public void reflectionTest() {
try {
// Person 클래스 로드
Class<?> myClass = Class.forName("Person");
/* 클래스 내 선언된 메서드의 목록 출력 */
/* 출력 : public String getName()
public int getAge() */
Method[] methods = myClass.getDeclaredMethods();
System.out.println("Declared methods:");
for (Method method : methods) {
System.out.println(method.toString());
}
/* 메서드의 매개변수와 반환 타입 확인 */
/* 출력 : Class Name : class Person
Method Name : getName
Return Type : java.lang.String */
Method method = methods[0];
System.out.println("\nMethod Details:");
System.out.println("Class Name: " + method.getDeclaringClass());
System.out.println("Method Name: " + method.getName());
System.out.println("Return Type: " + method.getReturnType());
/* 메서드 이름으로 호출 */
Object personInstance = myClass.getDeclaredConstructor(String.class, int.class).newInstance("John", 30);
Object nameResult = method.invoke(personInstance);
System.out.println("\nResult of invoking getName method: " + nameResult); // 출력 : Result of invoking getName method: John
/* 다른 클래스의 멤버 필드의 값 수정 */
Field field = myClass.getDeclaredField("age");
field.setAccessible(true);
int ageValue = (int) field.get(personInstance);
System.out.println("\nOriginal Age: " + ageValue); // 출력 : Original Age: 30
field.setInt(personInstance, ageValue + 5);
System.out.println("Updated Age: " + field.get(personInstance)); // 출력 : Updated Age: 35
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ReflectionTest().reflectionTest();
}
}
'Tech Interview > Language' 카테고리의 다른 글
[Language] 고유 락 (0) | 2024.03.27 |
---|---|
[Language] 스레드 (0) | 2024.03.27 |
[Language] 동기화와 비동기화 (0) | 2024.03.27 |
[Language] Record (0) | 2024.03.26 |
[Language] 직렬화와 역직렬화 (0) | 2024.03.26 |
✔️ 리플렉션
리플렉션이란?
- 이미 로딩이 완료된 클래스에서 또는 다른 클래스를 동적으로 로딩하여 구체적인 타입을 알지 못하더라도
생성자, 멤버 필드, 그리고 멤버 메소드를 사용할 수 있는 기법 - 즉, 런타임에 동적으로 특정 클래스의 정보를 객체화하여 분석 및 추출해낼 수 있음
- 객체를 통해서 클래스의 패키지 정보, 접근 지정자, 부모 클래스, 어노테이션 등을 얻을 수 있음
- 실행 시간에 다른 클래스를 동적으로 로딩하여 접근할 필요가 있을 때 사용
- 하지만 외부에 공개되지 않은 private 멤버도 메소드를 통해 지정할 경우 접근과 조작이 가능하기 때문에 주의해서 사용해야 함
- 또한 리플렉션은 동적으로 해석되는 유형이 포함되어 특정 JVM 최적화를 수행할 수 없어 성능이 떨어지므로
성능에 민감한 애플리케이션에서 자주 호출되는 코드에는 사용하지 않아야 함
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class ReflectionTest {
public void reflectionTest() {
try {
// Person 클래스 로드
Class<?> myClass = Class.forName("Person");
/* 클래스 내 선언된 메서드의 목록 출력 */
/* 출력 : public String getName()
public int getAge() */
Method[] methods = myClass.getDeclaredMethods();
System.out.println("Declared methods:");
for (Method method : methods) {
System.out.println(method.toString());
}
/* 메서드의 매개변수와 반환 타입 확인 */
/* 출력 : Class Name : class Person
Method Name : getName
Return Type : java.lang.String */
Method method = methods[0];
System.out.println("\nMethod Details:");
System.out.println("Class Name: " + method.getDeclaringClass());
System.out.println("Method Name: " + method.getName());
System.out.println("Return Type: " + method.getReturnType());
/* 메서드 이름으로 호출 */
Object personInstance = myClass.getDeclaredConstructor(String.class, int.class).newInstance("John", 30);
Object nameResult = method.invoke(personInstance);
System.out.println("\nResult of invoking getName method: " + nameResult); // 출력 : Result of invoking getName method: John
/* 다른 클래스의 멤버 필드의 값 수정 */
Field field = myClass.getDeclaredField("age");
field.setAccessible(true);
int ageValue = (int) field.get(personInstance);
System.out.println("\nOriginal Age: " + ageValue); // 출력 : Original Age: 30
field.setInt(personInstance, ageValue + 5);
System.out.println("Updated Age: " + field.get(personInstance)); // 출력 : Updated Age: 35
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ReflectionTest().reflectionTest();
}
}
'Tech Interview > Language' 카테고리의 다른 글
[Language] 고유 락 (0) | 2024.03.27 |
---|---|
[Language] 스레드 (0) | 2024.03.27 |
[Language] 동기화와 비동기화 (0) | 2024.03.27 |
[Language] Record (0) | 2024.03.26 |
[Language] 직렬화와 역직렬화 (0) | 2024.03.26 |