본문 바로가기

플밍 is 뭔들/JAVA

[자바] 자바 리플렉션 (Java Reflection)

※ 정의
 - 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 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) 정보 찾기, 새로운 객체만들기, 이름으로 메서드 실행하기 등등 여러가지 기능이 있는거 같다.
그렇기 때문에 여기서는 간단한 개념정도를 알아두고 필요할때 해당기능을 찾아서 공부해보길 바란다.