Java

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

MbyM 2020. 7. 26. 15:03

- 참고 : 인프런 >> 더 자바, 코드를 조작하는 다양한 방법, (백기선 강의)

 

Class 인스턴스 만들기 & 필드 접근하기

 

- > Class.newInstance() deperecated 됐으며 이제는 생성자를 통해 만들어야 함

 

생성자로 인스턴스 만들기

  • Constructor.newInstance(params)
Class<?> bookClass = Class.forName("com.example.test.reflection.Book");

Constructor<?> constructor_arg0 = bookClass.getConstructor();
Book book_arg0 = (Book)constructor_arg0.newInstance();

 

필드 값 접근하기

  • 특정 인스턴스 가지고 있는 값을 가져오는 것이기 때문에 인스턴스가 필요
  • Field.get(object)
  • Field.get(object,value)
  • Filed.set(object, value)
Field b = Book.class.getDeclaredField("B");
b.setAccessible(true);

String B = (String)b.get(new Book());

 

-> Static 필드를 가져올 때는 object가 없어도 되니 null을 넘기면 된다.

//A -> static field
Field a = Book.class.getDeclaredField("A");

//set
a.set(null,"AAAAA");
//get
String A = (String)a.get(null);

 

메소드 실행하기

  • Method.invoke(object, parmas)
Method method = Book.class.getDeclatedMethod("c");
c.setAccessible(true);

c.invoke(book);


//parameter를 넘겨줘야 하는 Method
Method d = Book.class.getDeclatedMethod("d",int.calss,int.class);
d.setAccessible(true);
int res = (int)d.voke(book,1,2);