| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 약수
- 스프링 시큐리티
- redis
- 모던자바
- java
- Reflection
- Deadlock
- Spring
- 리플렉션
- Junit5
- 운영체제
- 백준
- 프록시
- test
- OS
- Python
- 자바
- 스프링
- 다이나믹 프록시
- 문자열
- 모던 자바 인 액션
- spring security
- CS
- 객체지향
- 최소 신장 트리
- MST
- 파이썬
- proxy
- 알고리즘
- BOJ
Archives
- Today
- Total
Dev 달팽이 @_''
Java - 리플렉션 API(클래스 정보 조회) 본문
Java - 리플렉션 API(클래스 정보 조회)
자바 리플렉션(Java Reflection)
- 리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법
- 스프링에서 BeanFactory는 어플리케이션이 실행한 후 객체가 호출 될 당시 객체의 인스턴스를 사용
- 이 때 필요한 기술이 리플렉션
- Class<T> : https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html
Class<T>에 접근하는 방법
public class App {
public static void main(String[] args) throws ClassNotFoundException {
// 방법 1. 모든 클래스를 로딩 한 다음 Class<T>의 인스턴스가 생김
// 타입.class로 접근할 수 있음
Class<Book> bookClass = Book.class;
// 방법 2. 모든 인스턴스는 getClass() 메소드를 가지고 있음
// 인스턴스.getClass()로 접근할 수 있음
Book book = new Book();
Class<? extends Book> aClass = book.getClass();
// 방법 3. 클래스를 문자열로 읽어오는 방법
// Class.forName(FQCN)
// 클래스 패스에 해당하는 클래스가 없으면 ClassNotFoundException이 발생
Class<?> aClass1 = Class.forName("org.example.Book");
}
}
Class API의 활용
Book.java
public class Book {
private static String B = "BOOK";
private static final String C= "BOOK";
private String a="a";
public String d = "d";
protected String e = "e";
public Book() {
}
public Book(String a, String d, String e) {
this.a = a;
this.d = d;
this.e = e;
}
private void f(){
System.out.println("F");
}
public void g(){
System.out.println("g");
}
public int h(){
return 100;
}
}
public 필드 출력
App.java
Class<Book> bookClass = Book.class;
//bookClass.getFields()는 public만 리턴
Arrays.stream(bookClass.getFields()).forEach(System.out::println);

모든 필드 출력
//모든 필드를 출력
Arrays.stream(bookClass.getDeclaredFields()).forEach(System.out::println);

접근 지시자 무시하고 값 가져오기
//값을 가져올 때는 인스턴스가 필요함
Book book = new Book();
Arrays.stream(bookClass.getDeclaredFields()).forEach(f -> {
try{
f.setAccessible(true); //접근지시자 무시
System.out.printf("%s %s\n",f,f.get(book));
}
catch (IllegalAccessException e){
e.printStackTrace();
}
});

메소드 가져오기
//메소드 가져오기
Arrays.stream(bookClass.getMethods()).forEach(System.out::println);

Object에 상속받은 메소드도 모두 가져온다.
생성자 가져오기
// 생성자 가져오기
Arrays.stream(bookClass.getDeclaredConstructors()).forEach(System.out::println);

'Java&Spring > 더 자바, 코드를 조작하는 다양한 방법' 카테고리의 다른 글
| Java - 간단한 DI 프레임워크 만들기 (0) | 2022.01.09 |
|---|---|
| Java - 리플렉션(클래스 정보 수정 또는 실행) (0) | 2022.01.09 |
| Java - 바이트코드 조작 (0) | 2022.01.09 |
| Java - 코드 커버리지 (0) | 2022.01.07 |
| Java - 클래스 로더 (0) | 2022.01.07 |