※ 정의
- 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
※ 어떻게 가능할까?
- 자바 클래스 파일은 바이트 코드로 컴파일되어 Static 영역에 위치하게 된다. 그렇기 때문에 클래스의 이름만 알고 있으면 이 영역을 뒤져서 클래스에 대한 정보를 가져올 수 있다.
가저올 수 있는 정보 목록
ClassName
Class Modifiers(public, private, synchronized 등)
Package Info
SuperClass
Implemented Interface
Constructors
MethodsFields
Annotations
※ 리플렉션 사용 예1 (클래스에서 메서드 찾기)
public class Main {
public static void main(String[] args) {
try {
Class cls = Class.forName("ReflectionTest.A");
Method[] methodList = cls.getMethods();
for(int i = 0; i < methodList.length; i++){
Method method = methodList[i];
System.out.println("name : " + method.getName());
System.out.println("decl class : " + method.getDeclaringClass());
Class paraType[] = method.getParameterTypes();
for(int j = 0; j < paraType.length ; j++){
System.out.println("param" + (j+1) + " : " + paraType[j]);
}
Class excType[] = method.getExceptionTypes();
for(int j = 0; j < excType.length ; j++ ){
System.out.println("exception" + (j+1) + " : " + excType[j]);
}
System.out.println("----- ------ ------- -----");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
결과
name : method1
decl class : class ReflectionTest.A
param1 : class java.lang.String
exception1 : class java.lang.NullPointerException
----- ------ ------- -----
.
.
.
※ 리플렉션 사용 예2 (객체 비교)
public class Main {
public static void main(String[] args) {
try {
Class cls = Class.forName("ReflectionTest.A");
System.out.println("객체비교 시작");
boolean a = cls.isInstance(new Integer(30));
boolean b = cls.isInstance(new A());
if(a){
System.out.println("Integer 객체");
}
if(b){
System.out.println("A 객체");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
결과
객체비교 시작
A 객체
이 외에도 생성자(Constructor) 정보 찾기, 새로운 객체만들기, 이름으로 메서드 실행하기 등등 여러가지 기능이 있는거 같다.
그렇기 때문에 여기서는 간단한 개념정도를 알아두고 필요할때 해당기능을 찾아서 공부해보길 바란다.
'플밍 is 뭔들 > JAVA' 카테고리의 다른 글
[자바] 네트워킹 (Networking) (0) | 2017.09.28 |
---|---|
[자바] 쓰레드(thread) (0) | 2017.09.25 |
[자바] 인터페이스와 상속의 비교 및 정리 (3) | 2017.09.22 |
[자바] 예외처리 (Exception) (0) | 2017.09.19 |
[자바] 인터페이스 (Interface) (0) | 2017.09.19 |