package reflection.data;
public class BasicData {
public String publicField;
private int privateField;
public BasicData() {
System.out.println("BasicData.BasicData");
}
private BasicData(String data) {
System.out.println("BasicData.BasicData: " + data);
}
public void call() {
System.out.println("BasicData.call");
}
public String hello(String str) {
System.out.println("BasicData.hello");
return str + " hello";
}
private void privateMethod() {
System.out.println("BasicData.privateMethod");
}
void defaultMethod() {
System.out.println("BasicData.defaultMethod");
}
protected void protectedMethod() {
System.out.println("BasicData.protectedMethod");
}
}
package reflection.data;
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int sub(int a, int b) {
return a - b;
}
}
메서드 탐색
package reflection;
import reflection.data.BasicData;
import java.lang.reflect.Method;
public class MethodV1 {
public static void main(String[] args) {
Class<BasicData> helloClass = BasicData.class;
System.out.println("===== methods() =====");
Method[] methods = helloClass.getMethods();
for (Method method : methods) {
System.out.println("method = " + method);
}
System.out.println("===== declaredMethods() =====");
Method[] declaredMethods = helloClass.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println("declaredMethod = " + method);
}
}
}
- getMethods() : 해당 클래스와 상위 클래스에서 상속된 모든 public 메서드를 반환
- getDeclaredMethods() : 해당 클래스에서 선언된 모든 메서드를 반환하며, 접근 제어자에 관계없이 반환. 상속된 메서드는 포함하지 않음
동적 호출
package reflection;
import reflection.data.BasicData;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MethodV2 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// 정적 메서드 호출 - 일반적인 메서드 호출
BasicData helloInstance = new BasicData();
helloInstance.call(); // 이 부분은 코드를 변경하지 않는 이상 정적이다.
// 동적 메서드 호출 - 리플렉션 사용
Class<? extends BasicData> helloClass = helloInstance.getClass();
String methodName = "hello";
// 메서드 이름을 변수로 변경할 수 있다.
Method method1 = helloClass.getDeclaredMethod(methodName, String.class);
Object returnValue = method1.invoke(helloInstance, "hi");
System.out.println("returnValue = " + returnValue);
}
}
package reflection;
import reflection.data.Calculator;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
public class MethodV3 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Scanner scanner = new Scanner(System.in);
System.out.print("호출 메서드: ");
String methodName = scanner.nextLine();
System.out.print("숫자1: ");
int num1 = scanner.nextInt();
System.out.print("숫자2: ");
int num2 = scanner.nextInt();
Calculator calculator = new Calculator();
// 호출할 메서드를 변수 이름으로 동적으로 선택
Class<? extends Calculator> aClass = Calculator.class;
Method method = aClass.getMethod(methodName, int.class, int.class);
Object returnValue = method.invoke(calculator, num1, num2);
System.out.println("returnValue = " + returnValue);
}
}
'개발이 좋아서 > Java가 좋아서' 카테고리의 다른 글
리플렉션 - 활용 예제 (0) | 2024.12.01 |
---|---|
리플렉션 - 필드 탐색과 값 변경 (0) | 2024.12.01 |
리플렉션 - 클래스와 메타데이터 (0) | 2024.12.01 |
HTTP 기본 이론(간단 요약) (1) | 2024.12.01 |
네트워크 예외4 - 강제 종료 (0) | 2024.11.30 |