티스토리 뷰
반응형
Class 인스턴스에 있는 사용자 정의 클래스를 생성해보자
//Book
public class Book {
public static String A = "A";
private String B = "B";
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;
}
}
-
사용자 정의 클래스의 위치를 활용하여 클래스를 생성해보자.
public static void main( String[] args ) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { Class<?> bookClass = Class.forName("org.example.Book"); //파라미터 없는 생성자 이용 Constructor<?> constructor = bookClass.getConstructor(null); Book book = (Book) constructor.newInstance(); //파라미터 있는 생성자 이용 Constructor<?> constructor = bookClass.getConstructor(String.class); Book book = (Book) constructor.newInstance("parameter"); System.out.println(book); }
-
Class 인스턴스에서 생성한 클래스의 필드값들을 사용해보자
public class App { public static void main( String[] args ) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException { Class<?> bookClass = Class.forName("org.example.Book"); Constructor<?> constructor = bookClass.getConstructor(String.class); Book book = (Book) constructor.newInstance("parameter"); System.out.println(book); //필드 값을 가져오자 Field a = Book.class.getDeclaredField("A"); System.out.println(a.get(null)); //static하기 때문에 object 자리에 null을 넘겨준다. a.set(null, "AAA"); //set 또한 첫번째 파라미터는 해당 인스턴스가 들어가야하지만 static 필드이기 때문에 null이 들어간다. System.out.println(a.get(null)); } }
결과
-
A의 필드값은 static하기 때문에 인스턴스가 생성되지 않아도 가져올 수가 있어, a.get(null) 및 a.set(null, "") 처럼 인스턴스 자리에 null이 들어간다.
-
만약 static 필드가 아니라면,
Field b = Book.class.getDeclaredField("B"); b.setAccessible(true); //private 접근 System.out.println(b.get(book)); b.set(book, "BBBB"); System.out.println(b.get(book));
결과
-
-
Class 인스턴스에서 생성한 클래스의 메소드들을 사용해보자
//private 메소드 Method c = Book.class.getDeclaredMethod("c"); c.setAccessible(true); //C라는 메소드는 private 접근 제한자이기 때문에 setAccessible 설정한다. c.invoke(book); //해당 매소드의 인스턴스를 파라미터로 넣어줘야 한다. //public 메소드 Method c = Book.class.getDeclaredMethod("sum", int.class, int.class); int invoke = (int)c.invoke(book, 1, 2); System.out.println(invoke);
- getDeclaredMethod에 파라미터가 있을 때, primitive 타입과 reference 타입을 구분한다.
- 즉, int와 Integer를 구분하는 것이다.
- getDeclaredMethod에 파라미터가 있을 때, primitive 타입과 reference 타입을 구분한다.
반응형
'Java > The Java' 카테고리의 다른 글
[The Java] 프록시 패턴 (0) | 2021.01.03 |
---|---|
[The Java] 리플렉션 API(3) : 나만의 DI를 만들자 (0) | 2021.01.03 |
[The Java] 애노테이션과 리플렉션 (0) | 2021.01.03 |
[The Java] 리플렉션 API(1) : 클래스 정보 조회 (0) | 2021.01.03 |
[The Java] 클래스 로더와 JVM (0) | 2021.01.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- try catch finally
- JPA
- Effective Java
- 빌더 패턴
- flatMap
- junit
- package-private
- 팩토리 메소드 패턴
- jdk버전
- 스프링부트
- ifPresent
- Spring
- 김영한
- springboot
- @Lazy
- java
- effectivejava
- 복사 팩토리
- 인프런
- 점층적 생성 패턴
- 이펙티브 자바
- 연관관계
- 정적팩터리메서드
- try with resources
- 생성자
- 자바8
- mustache
- 빈 순환 참조
- java8
- 이펙티브자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함