Book Instance
public class Book {
public static String A = "A";
private String B = "B";
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;
}
}
Class 인스턴스 만들기
- Class.newInstance()는 deprecated 됬으며 이제부터는
- 생성자를 통해서 만들어야 한다.
생성자로 인스턴스 만들기
- Constructor.newInstance(params)
예제 코드
public class App {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
final Class<?> bookClass = Class.forName("com.example.thejava.di.reflection.Book");
final Constructor<?> defaultConstructor = bookClass.getConstructor();
final Constructor<?> constructor = bookClass.getConstructor(String.class);
final Book book = (Book) defaultConstructor.newInstance();
final Book book2 = (Book) constructor.newInstance("Hello");
}
}
필드 값 접근하기 / 설정하기
- 특정 인스턴스가 가지고 있는 값을 가져오는 것이기 대문에 인스턴스가 필요하다.
- Field.get(object)
- Field.set(object, value)
- Static 필드를 가져올 때는 object가 없어도 되니까 null을 넘기면 된다.
예제 코드 (static Field)
final Field a = Book.class.getDeclaredField("A");
// Field A는 static한 Field이므로 Instance마다 다른것이 아니고
// 모두 공유하는 자원이므로 특정한 Object를 넘겨주지 않는다.
System.out.println(a.get(null));
set함수를 통해서 값을 설정할 수 있다.
System.out.println(a.get(null));
a.set(null,"AAAAAA");
System.out.println(a.get(null));
실행 결과

예제 코드 (Field)
final Book book = (Book) defaultConstructor.newInstance();
final Field b = Book.class.getDeclaredField("B");
// Field B는 static 변수가 아니므로 인스턴스가 필요하다.
// book 이라는 인스턴스의 B라는 필드 가져오기
// B가 private이기 때문에 accessible을 true로 바꿔줘야 값을 가져올 수 있다.
b.setAccessible(true);
b.get(book);
set함수를 통해서 값 설정하기
System.out.println(b.get(book));
b.set(book, "BBBBBB");
System.out.println(b.get(book));
실행 결과

메소드 실행하기
- Object.Method.invoke(object, params)
final Method c = Book.class.getDeclaredMethod("c");
c.invoke(book);
final Method d = Book.class.getDeclaredMethod("sum", int.class, int.class);
System.out.println((int) d.invoke(book, 1, 2));