본문 바로가기

Java/Java

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

Class 인스턴스 만들기

  • Class.newInstance()는 deprecated 됐으며 이제부터는

  • 생성자를 통해서 만들어야 한다.

 

생성자로 인스턴스 만들기

  • Constructor.newInstance(params)

 

필드 값 접근하기/설정하기

  • 특정 인스턴스가 가지고 있는 값을 가져오는 것이기 때문에 인스턴스가 필요하다.

  • Field.get(object)

  • Filed.set(object, value)

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

 

메서드 실행하기

  • Object Method.invoke(object, params)

 

생성자를 이용한 인스턴스 생성

Class<?> bookClass = Class.forName("me.choi.Book");
//bookClass.newInstance();
Constructor<?> constructor = bookClass.getConstructor(null);
constructor.newInstance();
Book book = (Book) constructor.newInstance();

book 인스턴스 생성 완료!

파라미터를 가지는 생성자의 인스턴스 생성(위 와 동일하지만 파라미터 타입만 명시하면 된다.)

Constructor<?> constructor1 = bookClass.getConstructor(int.class);
Book book1 = (Book) constructor1.newInstance("choijunwoo");

필드 조작

여러 곳에서 참조하는(static) 필드의 값을 가져오는 경우

/*해당 필드를 변형 시켜보자!*/
public static String A = "A";
Field field = bookClass.getField("A");
//Field field = bookClass.getDeclaredField("A");

field.set(null, "choi");
System.out.println(field.get(null));

실행결과

특정 Class에서만 사용하는 필드의 값을 가져오는 경우

  • static의 경우엔 object 값을 NULL로 선언하였지만
  • 해당 경우엔 NULL이 아닌 해당 클래스의 값을 선언하여야 한다.
private  String B = "B";

 

Constructor<?> constructor = bookClass.getConstructor(null);
Book book = (Book) constructor.newInstance();
Field field1 = bookClass.getDeclaredField("B");
field1.setAccessible(true);
field1.get(book);
System.out.println(field1.get(book));

메서드 조작 (getDeclaredMethod, invoke)

Method method = bookClass.getDeclaredMethod("c");
method.invoke(book);

 

파라미터와 리턴 값이 존재하는 경우

getDeclaredMethod 사용 시 메서드명, 타입 명시하는 것에 주의!

Method method1 = bookClass.getDeclaredMethod("sum",int.class,int.class);
int result = (int) method1.invoke(book,1,2);
System.out.println(result);

Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/Reflectionstudy/Refactoring

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com