MENU

Java 리플렉션이 쉽습니다.

목차

Java 리플렉션이 쉽습니다.

자바리플렉션API를 쉽게 사용할 수 있는 유틸리티 클래스를 소개합니다.

리플렉션이란?

리플렉션 API는,java.lang.reflect'패키지에 포함되어 있으며,
Java 클래스로부터 필드나 메소드 등의 정보를 취득하는 API입니다.
주로 다음 클래스를 사용합니다.

  • java.lang.Class
  • java.lang.reflect.Constructor
  • java.lang.reflect.Method
  • java.lang.reflect.Field

리플렉션를 사용하면 클래스 생성이나 메소드 호출을 직접 코딩하지 않고,
문자열에서 클래스의 인스턴스를 생성하거나 메서드를 실행할 수 있습니다.

클래스명이나 메소드명의 정의는 XML등의 외부 파일에 기술하는 것으로, 어플리케이션을 런타임의 환경의 변화에 동적으로 대응시킬 수가 있습니다.
또한 유연한 애플리케이션을 구축하는 데 매우 효과적인 API가 되었습니다.


리플렉션의 목적

리플렉션는 사용자가 직접 사용하는 것은별로 많지 않지만,
Struts등의 Web 어플리케이션이나 O/R 매핑등의 프레임워크내에서는 많이 사용되고 있습니다.

예를 들어 웹 화면의 입력 데이터를 JavaBeans 속성으로 자동 설정하거나
JavaBeans 프로퍼티을 바탕으로 자동적으로 갱신하는 SQL을 발행하는 경우 등에 이용되고 있습니다.

또, 어플리케이션의 기동시에 기능을 확장하는 플러그인을 동적으로 읽어 등록하는 등의 기능은리플렉션을 사용하면 쉽게 실현할 수 있습니다.

샘플 실행

그럼, 샘플을 실행해 주시고, 꼭 프레임워크적인 프로그래밍을 체감해 주세요.

여기에서는 다음 클래스를 사용합니다.리플렉션유틸리티의 간단한 사용법을 보여줍니다.

Main.java···실행하는 클래스
BeanUtil.java··· 리플렉션의 유틸리티 클래스
FreeSoft.java・・・프리소프를 나타내는 클래스로 리플렉션으로서 이용됩니다.

● 평소대로 실행한 경우

System.out.println (“>>>통상의 경우”);
FreeSoft freeSoft = new FreeSoft();
freeSoft.setName(“Chat&Messenger 채팅도 메신저도!!”);
freeSoft.showName();
freeSoft.showPrice(0);

● 리플렉션을 사용하여 실행한 경우

System.out.println(“>>> 리플렉션을 사용한 경우”);
// FreeSoft 클래스의 인스턴스 생성
Object invokeObject = BeanUtil.newInstance( "FreeSoft");
// name 필드에 값을 설정합니다.
BeanUtil.setProperty(invokeObject, “이름” , “Chat&Messenger 채팅도 메신저도!!”);
// FreeSoft showName() 메서드를 실행합니다.
BeanUtil.invoke(invokeObject, “showName”, null);
// FreeSoft showPrice() 메서드를 실행합니다.
// 메소드에 인수가 있는 경우는 Object형의 배열로 건네줄 필요가 있다.
BeanUtil.invoke(invokeObject, “showPrice”,new Object[]{new Integer(0)});

● 실행 결과

보통의 경우도, 리플렉션을 사용했을 경우도 실행 결과는 같습니다.

>>> 통상의 경우

소프트 이름: Chat&Messenger 채팅도 메신저도! !

가격 : 0엔

>>> 리플렉션을 사용한 경우

소프트 이름: Chat&Messenger 채팅도 메신저도! !

가격 : 0엔

BeanUtil 메소드 상세

newInstance

public static Object newInstance(String className) throws Exception
캐릭터 라인 「className」로부터 인스턴스를 생성해 돌려줍니다.

매개변수:
className – 정규화된 클래스 이름
반환값:
완전한 클래스 이름의 새 인스턴스
예외:
예외

newInstance

public static Object newInstance(String className, Object[] argObj) throws Exception
캐릭터 라인 「className」로부터 인스턴스를 생성해 돌려줍니다.

매개변수:
className – 정규화된 클래스 이름
argObj – 생성자 인수
반환값:
완전한 클래스 이름의 새 인스턴스
예외:
예외

newInstance

public static Object newInstance(Class clazz) throws Exception
클래스 「clazz」로부터 인스턴스를 생성해 돌려줍니다.

매개변수:
clazz – 클래스
반환값:
clazz의 새로운 인스턴스
예외:
예외

newInstance

public static Object newInstance(Class clazz, Object[] argObj) throws Exception
클래스 「clazz」로부터 인스턴스를 생성해 돌려줍니다.

매개변수:
clazz – 클래스
argObj – 생성자 인수
반환값:
clazz의 새로운 인스턴스
예외:
예외

setProperty

public static void setProperty(Object invokeObject, String fieldName, Object value) throws Exception
오브젝트 「invokeObject」의 필드 「fieldName」의 setter 메소드를 호출해, 값 「value」를 포함합니다.

setter 메서드가 없으면 필드로 직접 값을 설정합니다. 다만, 이 경우 대상 프로퍼티의 액세스 한정자는 public인 것

매개변수:
invokeObject – 실행할 객체
fieldName – 실행할 객체의 속성 이름
value – 설정할 값
예외:
예외 – 다음 예외가 발생합니다.
InvocationTargetException – 기본 메소드가 예외를 throw하는 경우
IllegalAccessException – 이 Method 객체가 Java
언어 액세스 제어를 실시해, 기본이 되는 메소드에 액세스 할 수 없는 경우
NoSuchMethodException – 지정된 이름의 메소드를 찾을 수 없는 경우

getProperty

public static Object getProperty(Object invokeObject, String fieldName) throws Exception
object invokeObject 의 필드 fieldName 의 getter 메소드를 호출치를 가져옵니다.
getter 메서드가 없으면 필드에서 직접 값을 가져옵니다. 다만, 이 경우 대상 프로퍼티의 액세스 한정자는 public인 것

매개변수:
invokeObject – 실행할 객체
fieldName – 실행할 객체의 속성 이름
반환값:
게터 메소드의 리턴 값
예외:
예외 – 다음 예외가 발생합니다.
InvocationTargetException – 기본 메소드가 예외를 throw하는 경우
IllegalAccessException – 이 Method 객체가 Java
언어 액세스 제어를 실시해, 기본이 되는 메소드에 액세스 할 수 없는 경우
NoSuchFieldException – 지정된 이름의 필드를 찾을 수 없는 경우

invoke

public static Object invoke(Object invokeObject, String callMethod, Object[] argObjects) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException
오브젝트 "invokeObject"의 메소드 "callMethod"를 실행합니다.
리턴값이 있는 경우는, Object형으로서 얻을 수가 있습니다.

매개변수:
invokeObject – 실행할 객체
callMethod – 실행할 메소드 이름
argObjects - 인수가 있으면 객체의 배열로 전달합니다. 인수가 없는 경우는 null 를 건네줍니다.
반환값:
callMethod를 실행한 리턴값
예외:
InvocationTargetException – 기본 메소드가 예외를 throw하는 경우
IllegalAccessException – 이 Method 객체가 Java
언어 액세스 제어를 실시해, 기본이 되는 메소드에 액세스 할 수 없는 경우
NoSuchMethodException – 지정된 이름의 메소드를 찾을 수 없는 경우

findMethod

public static Method findMethod(Object invokeObject, String callMethod, Object[] argObjects) throws NoSuchMethodException
오브젝트 "invokeObject"의 메소드 "callMethod"를 검색합니다.

매개변수:
invokeObject – 실행할 객체
callMethod – 실행할 객체의 메소드 이름
argObjects - 인수가 있으면 객체의 배열로 전달합니다. 인수가 없는 경우는 null 를 건네줍니다.
반환값:
지정된 인수의 조건에 일치하는 Method 객체
예외:
NoSuchMethodException – 일치하는 메소드를 찾을 수 없거나 이름이 “” 또는 “”인 경우

setField

public static void setField(Object invokeObject, String fieldName, Object value) throws IllegalAccessException, NoSuchFieldException
실행 대상의 오브젝트 「invokeObject」의 필드명 「fieldName」에 값 「value 」를 포함합니다.

매개변수:
invokeObject – 실행할 객체
fieldName – 실행할 오브젝트의 필드 이름
value – 설정할 값
예외:
IllegalAccessException – 지정된 객체가 기본이 되는 필드 (또는 그 서브 클래스인가 구현측)
를 선언한다 클래스 또는 인터페이스의 인스턴스가 아닌 경우, 또는 랩 해제 변환이 실패했을 경우
NoSuchFieldException – 지정된 이름의 필드를 찾을 수 없는 경우

getField

public static Object getField(Object invokeObject, String fieldName) throws IllegalAccessException, NoSuchFieldException
실행 대상의 오브젝트 「invokeObject」의 필드명 「fieldName」의 값을 취득합니다.

매개변수:
invokeObject – 실행할 객체
fieldName – 실행할 오브젝트의 필드 이름
반환값:
반환 값
예외:
IllegalAccessException – 지정된 객체가 기본이 되는 필드 (또는 그 서브 클래스인가 구현측)
를 선언한다 클래스 또는 인터페이스의 인스턴스가 아닌 경우, 또는 랩 해제 변환이 실패했을 경우
NoSuchFieldException – 지정된 이름의 필드를 찾을 수 없는 경우

hasField

public static boolean hasField(Object object, String fieldName) throws Exception
객체 "object"가 필드 이름 "fieldName"을 선언하는지 확인합니다.

매개변수:
객체 – 검사 대상 객체
fieldName – 검사할 필드 이름
반환값:
선언하는 경우 true
예외:
예외

getAllFields

public static java.util.TreeSet getAllFields(Object object) throws Exception
매개변수:
객체
반환값:
예외:
예외

getShortClassName

public static String getShortClassName(Object 객체)
오브젝트로부터 완전 수식되어 있지 않은 클래스명을 취득합니다.

매개변수:
객체
반환값:

getShortClassName

public static String getShortClassName(String className)
완전 수식명으로부터 클래스명을 취득합니다.

매개변수:
className
반환값:

getFieldName

public static String getFieldName(String methodName)
메소드 이름에서 필드 이름을 변경합니다. JavaBeans의 관례에 적합해야 합니다.

매개변수:
methodName
반환값:

isClassExist

public static boolean isClassExist(String className)
완전 수식명 「className」이 존재하는 클래스명인가를 검증합니다.

매개변수:
className
반환값:

getPropertyDescriptors

public static PropertyDescriptor[] getPropertyDescriptors(Object object) throws IntrospectionException
「object」의 오브젝트 정보를 보관 유지하는 PropertyDescriptor 를 돌려줍니다.

매개변수:
객체
반환값:
예외:
java.beans.IntrospectionException

BeanUtil 소스 코드

  • URL을(를) 확인했습니다!
목차