-
리플렉션 API 1부: 클래스 정보 수정 또는 실행백기선(인프런 강의)/더 자바, 코드를 조작하는 다양한 방법 2020. 6. 14. 16:14반응형
Class 인스턴스 만들기
- Class.newInstance()는 deprecated 됐으며 이제부터는
- 생성자를 통해서 만들어야 한다.
생성자로 인스턴스 만들기
- Constructor.newInstance(params)
필드 값 접근하기/설정하기
- 특정 인스턴스가 가지고 있는 값을 가져오는 것이기 때문에 인스턴스가 필요하다.
- Field.get(object)
- Filed.set(object, value)
- Static 필드를 가져올 때는 object가 없어도 되니까 null을 넘기면 된다.
메소드 실행하기
- Object Method.invoke(object, params)
예시
package kr.co.study; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class RunMain { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException { Class<?> bookClass = Class.forName("kr.co.study.Book"); //파라메터가 없는 생성자 가져오기 Constructor<?> constructor = bookClass.getConstructor(null); //Book 의 인스턴스 생성 Book book = (Book) constructor.newInstance(); System.out.println("book 이 제대로 생성되었는가?" + book); //파라메터가 있는 생성자 가져오기 Constructor<?> constructor2 = bookClass.getConstructor(String.class); Book book2 = (Book) constructor2.newInstance("myBook"); System.out.println("book2 이 제대로 생성되었는가?" + book2); //A필드에잇는 값 가져오기 Field a = Book.class.getDeclaredField("A"); System.out.println(a.get(null)); a.set(null, "AAAAAA"); System.out.println(a.get(null)); //B라는 필드의 값을 가져오기 Field b = Book.class.getDeclaredField("B"); //private으로 접근자가 설정되어있어서 b.setAccessible(true); System.out.println(b.get(book)); b.set(book, "BBBBBBBBBBBB"); System.out.println(b.get(book)); //private로 된 메소드 가져오기 Method privateMethod = Book.class.getDeclaredMethod("c"); privateMethod.setAccessible(true); privateMethod.invoke(book); //public으로된 메소드 가져오기 Method publicMethod = Book.class.getDeclaredMethod("sum" , int.class, int.class); int invoke= (int) publicMethod.invoke(book, 1, 3); System.out.println(invoke); } }
package kr.co.study; public class Book { public static String A = "a"; private String B = "BOOK"; 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; } }
반응형'백기선(인프런 강의) > 더 자바, 코드를 조작하는 다양한 방법' 카테고리의 다른 글
클래스의 프록시 (0) 2020.06.16 다이내믹 프록시 (0) 2020.06.16 리플렉션 정리 (0) 2020.06.14 애노테이션과 리플랙션 (0) 2020.06.14 리플렉션 API 1부: 클래스 정보 조회 (0) 2020.06.09