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();
파라미터를 가지는 생성자의 인스턴스 생성(위 와 동일하지만 파라미터 타입만 명시하면 된다.)
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
'Java > Java' 카테고리의 다른 글
(JAVA) 프록시 패턴 (0) | 2019.12.24 |
---|---|
(JAVA) 리플렉션 API(4) - 나만의 DI 프레임워크 만들어보기 (0) | 2019.12.24 |
(JAVA) 리플렉션 API(2) - 애노테이션과 리플렉션 (0) | 2019.12.22 |
(JAVA) 리플렉션 API(1) - 클래스 정보 조회 (0) | 2019.12.22 |
(JAVA) 바이트코드 조작(3) - javaagent (0) | 2019.12.22 |