자바 반사 메커니즘 학습 1

자바 반사 체 제 는 컴 파일 기간 (Compile Time) 이외 의 운행 기간 (Runtime) 검사 류, 인터페이스, 변수 와 방법 에 대한 정 보 를 제공 할 수 있 습 니 다.반 사 는 또한 우리 로 하여 금 운행 기 실례 화 대상, 호출 방법, get / set 방법 을 호출 하여 변수의 값 을 얻 게 할 수 있다.
다음은 자바 반사 의 간단 한 예 입 니 다.
import java.lang.reflect.Method;


public class MyObject {
    String name;
    String password;


    public MyObject(String name, String password) {
        super();
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public static void main(String[] args) {
        Method[] methods = MyObject.class.getMethods();

        for(Method method : methods){
            System.out.println("method = " + method.getName());
        }
    }
}

이 예 에서 MyObject 클래스 의 class 속성 을 호출 하여 대응 하 는 Class 클래스 의 대상 을 얻 고, 이 Class 클래스 의 대상 을 통 해 MyObject 클래스 의 방법 을 집합 합 니 다.이 방법의 집합 을 교체 하고 모든 방법의 이름 을 인쇄 합 니 다.출력 결과:
method = main
method = getName
method = setName
method = getPassword
method = setPassword
method = wait
method = wait
method = wait
method = equals
method = toString
method = hashCode
method = getClass
method = notify
method = notifyAll

자바 반사 체 제 를 사용 하면 운영 시기 에 자바 류 의 정 보 를 검사 할 수 있 습 니 다. 자바 류 의 정 보 를 검사 하 는 것 은 자바 반사 체 제 를 사용 할 때 하 는 첫 번 째 일 입 니 다. 이러한 정 보 를 얻 으 면 다음 과 같은 내용 을 얻 을 수 있 습 니 다.
Class                                    

클래스 대상
클래스 의 정 보 를 검사 하기 전에 클래스 의 클래스 대상 을 가 져 와 야 합 니 다.자바 의 모든 유형 은 기본 유형 (int, long, float 등) 을 포함 하고 배열 도 이와 관련 된 Class 류 의 대상 이 있 습 니 다.컴 파일 기간 에 클래스 이름 을 알 고 있다 면 다음 과 같은 방식 으로 클래스 대상 을 가 져 올 수 있 습 니 다.
Class myObjectClass = MyObject.class;

컴 파일 기간 에 클래스 의 이름 을 모 르 지만 실행 기간 에 클래스 이름 의 문자열 을 얻 을 수 있다 면 클 라 스 대상 을 가 져 올 수 있 습 니 다.
String className = ... ;//            
Class class = Class.forName(className);

Class. forName () 방법 을 사용 할 때 클래스 가 있 는 가방 의 이름 을 포함 하 는 클래스 의 전체 이름 을 제공 해 야 합 니 다.예 를 들 어 MyObject 류 는 com. jenkov. myapp 가방 에 있 는데 그의 전체 이름 은 com. jenkov. myapp. MyObject 이다.Class. forName () 방법 을 호출 할 때 컴 파일 경로 (classpath) 에서 해당 하 는 클래스 를 찾 지 못 하면 Class NotFoundException 을 던 집 니 다.
유명무실 하 다
클래스 대상 에서 두 버 전의 클래스 이름 을 가 져 올 수 있 습 니 다.getName () 방법 으로 클래스 의 모든 한정 클래스 이름 을 되 돌려 줍 니 다 (패키지 이름 포함):
Class aClass = ... //  Class  ,      Class    
String className = aClass.getName();

클래스 이름 만 가 져 오 려 면 getSimple Name () 방법 을 사용 하 십시오.
Class aClass = ... //  Class  ,      Class    
String simpleClassName = aClass.getSimpleName();

수식 부호
클래스 대상 을 통 해 public, private, static 등의 키 워드 를 방문 할 수 있 습 니 다. 다음 과 같은 방법 으로 클래스 의 수식 자 를 얻 을 수 있 습 니 다.
Class  aClass = ... //  Class  ,      Class    
int modifiers = aClass.getModifiers();

수정자 들 은 int 형식의 숫자 로 포장 되 어 있 습 니 다. 그러면 모든 수정자 들 은 하나의 비트 표지 (flag bit) 입 니 다. 이 표 지 는 수정자 의 유형 을 설정 하고 제거 할 수 있 습 니 다.자바. lang. reflect. Modifier 클래스 의 방법 으로 수정자 의 종 류 를 검사 할 수 있 습 니 다:
Modifier.isAbstract(int modifiers);
Modifier.isFinal(int modifiers);
Modifier.isInterface(int modifiers);
Modifier.isNative(int modifiers);
Modifier.isPrivate(int modifiers);
Modifier.isProtected(int modifiers);
Modifier.isPublic(int modifiers);
Modifier.isStatic(int modifiers);
Modifier.isStrict(int modifiers);
Modifier.isSynchronized(int modifiers);
Modifier.isTransient(int modifiers);
Modifier.isVolatile(int modifiers);

패키지 정보
Class 대상 을 사용 하여 다음 과 같은 방식 으로 가방 정 보 를 얻 을 수 있 습 니 다.
Class  aClass = ... //  Class  ,      Class    
Package package = aClass.getPackage();

패키지 대상 을 통 해 가방 에 대한 정 보 를 얻 을 수 있 습 니 다. 예 를 들 어 가방 이름, Manifest 파일 을 통 해 컴 파일 경로 에 있 는 jar 가방 의 지정 한 정 보 를 방문 할 수 있 습 니 다. 예 를 들 어 Manifest 파일 에서 가방 의 버 전 번 호 를 지정 할 수 있 습 니 다.
부계
Class 대상 을 통 해 클래스 의 부모 클래스 를 방문 할 수 있 습 니 다. 다음 과 같 습 니 다.
Class superclass = aClass.getSuperclass();

슈퍼 클 라 스 대상 은 사실 클 라 스 클래스 의 인 스 턴 스 이기 때문에 이 대상 에서 반사 작업 을 계속 할 수 있 습 니 다.실현 인터페이스
다음 과 같은 방식 으로 지정 한 클래스 가 실 현 된 인터페이스 집합 을 가 져 올 수 있 습 니 다.
Class  aClass = ... //  Class  ,      Class    
Class[] interfaces = aClass.getInterfaces();

하나의 클래스 가 여러 개의 인 터 페 이 스 를 실현 할 수 있 기 때문에 getInterfaces ();방법 은 클 라 스 배열 을 되 돌려 줍 니 다. 자바 인터페이스 에 도 해당 하 는 클 라 스 대상 이 있 습 니 다.메모: getInterfaces () 방법 은 현재 클래스 에서 실 현 된 인터페이스 만 되 돌려 줍 니 다.현재 클래스 의 부모 클래스 가 인 터 페 이 스 를 실현 하면 이 인 터 페 이 스 는 되 돌아 오 는 Class 집합 에 있 지 않 습 니 다. 비록 현재 클래스 는 부모 인터페이스 가 실현 되 었 지만.구조 기
당신 은 다음 과 같은 방식 으로 하나의 구조 방법 을 방문 할 수 있 습 니 다.
Constructor[] constructors = aClass.getConstructors();

Constructor 에 대한 더 많은 정 보 는 Constructors 를 방문 할 수 있 습 니 다.방법.
당신 은 다음 과 같은 방식 으로 하나의 종류의 모든 방법 을 방문 할 수 있 습 니 다.
Method[] method = aClass.getMethods();

변량
다음 과 같은 방식 으로 구성원 변 수 를 방문 할 수 있 습 니 다.
Field[] method = aClass.getFields();

주해
다음 과 같은 방식 으로 주 해 를 방문 할 수 있 습 니 다.
Annotation[] annotations = aClass.getAnnotations();

예시:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;


public class MyObject {
    String name;
    String password;


    public MyObject(String name, String password) {
        super();
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public static void main(String[] args) {
        Class myObject = MyObject.class;

        Method[] methods = myObject.getMethods();
        Field[] fields = myObject.getDeclaredFields();
        Constructor[] constructors = myObject.getDeclaredConstructors();

        System.out.println(myObject.getName());
        System.out.println(myObject.getPackage());
        System.out.println(myObject.getSuperclass());
        System.out.println(myObject.getSimpleName());
        System.out.println(myObject.getModifiers());
        for(Method method : methods){
            System.out.println("method = " + method.getName());
        }
        for(Field field : fields){
            System.out.println("field = " + field.getName());
        }
        for(Constructor constructor : constructors){
            System.out.println("constructor = " + constructor.getName());
        }
    }
}

출력 결과:
MyObject
null
class java.lang.Object
MyObject
1
method = main
method = getName
method = setName
method = getPassword
method = setPassword
method = wait
method = wait
method = wait
method = equals
method = toString
method = hashCode
method = getClass
method = notify
method = notifyAll
field = name
field = password
constructor = MyObject

좋은 웹페이지 즐겨찾기