백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법
리플렉션 API 1부: 클래스 정보 수정 또는 실행
레알윙
2020. 6. 14. 16:14
반응형
Class 인스턴스 만들기
- Class.newInstance()는 deprecated 됐으며 이제부터는
- 생성자를 통해서 만들어야 한다.
생성자로 인스턴스 만들기
- Constructor.newInstance(params)
필드 값 접근하기/설정하기
- 특정 인스턴스가 가지고 있는 값을 가져오는 것이기 때문에 인스턴스가 필요하다.
- Field.get(object)
- Filed.set(object, value)
- Static 필드를 가져올 때는 object가 없어도 되니까 null을 넘기면 된다.
메소드 실행하기
- Object Method.invoke(object, params)
예시
package kr.co.study;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class RunMain {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Class<?> bookClass = Class.forName("kr.co.study.Book");
//파라메터가 없는 생성자 가져오기
Constructor<?> constructor = bookClass.getConstructor(null);
//Book 의 인스턴스 생성
Book book = (Book) constructor.newInstance();
System.out.println("book 이 제대로 생성되었는가?" + book);
//파라메터가 있는 생성자 가져오기
Constructor<?> constructor2 = bookClass.getConstructor(String.class);
Book book2 = (Book) constructor2.newInstance("myBook");
System.out.println("book2 이 제대로 생성되었는가?" + book2);
//A필드에잇는 값 가져오기
Field a = Book.class.getDeclaredField("A");
System.out.println(a.get(null));
a.set(null, "AAAAAA");
System.out.println(a.get(null));
//B라는 필드의 값을 가져오기
Field b = Book.class.getDeclaredField("B");
//private으로 접근자가 설정되어있어서
b.setAccessible(true);
System.out.println(b.get(book));
b.set(book, "BBBBBBBBBBBB");
System.out.println(b.get(book));
//private로 된 메소드 가져오기
Method privateMethod = Book.class.getDeclaredMethod("c");
privateMethod.setAccessible(true);
privateMethod.invoke(book);
//public으로된 메소드 가져오기
Method publicMethod = Book.class.getDeclaredMethod("sum" , int.class, int.class);
int invoke= (int) publicMethod.invoke(book, 1, 3);
System.out.println(invoke);
}
}
package kr.co.study;
public class Book {
public static String A = "a";
private String B = "BOOK";
public Book() {
}
public Book(String b) {
B = b;
}
public void c() {
System.out.println("C");
}
public int sum(int left, int right) {
return left + right;
}
}
반응형