Dev 달팽이 @_''

Java - 리플렉션(클래스 정보 수정 또는 실행) 본문

Java&Spring/더 자바, 코드를 조작하는 다양한 방법

Java - 리플렉션(클래스 정보 수정 또는 실행)

다본죽 2022. 1. 9. 18:15

Java - 리플렉션(클래스 정보 수정 또는 실행)

 

Class 인스턴스 만들기

  • Class.newInstance()는 deprecated 됐으므로 이제 부터는
  • 생성자를 통하여 만들어야 함
//Class API를 통해서 인스턴스를 만드는 방법
Class<?> bookClass = Class.forName("org.example.Book");
Constructor<?> constructor = bookClass.getConstructor(String.class);
Book book = (Book)constructor.newInstance("myBook");
System.out.println(book);

 

생성자로 인스턴스 만들기

Constructor.newInstance(params)

 

Field에 접근하고 수정하는 방법

 

Book.java

public class Book {

    public static String A = "A";

    private String B = "B";

    public Book() {
    }

    public Book(String b) {
        B = b;
    }

    private void c(){
        System.out.println("C");
    }

    public int sum(int left,int right){
        return left+right;
    }
}

 

  • Field.get(object)로 가져오고
  • Field.set(object,value)로 수정
  • Static 필드를 가져올 때는 object가 없어도 되니까 null을 넘기면 됨
// Field에 접근하고 수정하는 방법
Field a = Book.class.getDeclaredField("A");
System.out.println(a.get(null));
a.set(null,"AAAAA");
System.out.println(a.get(null));

  • Static 필드가 아니라면 특정 인스턴스가 가지고 있는 값을 가져오는 것이기 때문에 인스턴스가 필요
Field b = Book.class.getDeclaredField("B");
b.setAccessible(true);
System.out.println(b.get(book));
b.set(book,"BBBBBB");
System.out.println(b.get(book));

 

메소드 실행

  • Object Method.invoke(object, params)를 통하여 실행
  • 접근 지시자가 private인 경우 setAccessible(true)를 통하여 접근 지시자를 무시한다.
// Method 실행하는 방법
Method c = Book.class.getDeclaredMethod("c");
c.setAccessible(true);
c.invoke(book);

  • parameter를 받는 함수라면 parameter의 타입을 넣어준다.
Method d = Book.class.getDeclaredMethod("sum", int.class, int.class);
int invoke = (int) d.invoke(book,1,2);
System.out.println(invoke);