Reflection - 클래스 정보 수정

현시기얌·2022년 2월 22일

Reflection

목록 보기
3/4

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));
profile
현시깁니다

0개의 댓글