>  기사  >  Java  >  클래스 및 객체 정보를 얻기 위한 Java 리플렉션에 대한 자세한 소개

클래스 및 객체 정보를 얻기 위한 Java 리플렉션에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-28 10:51:531671검색

Reflection은 객체와 클래스가 어떤 것인지 컴파일 타임에 예측이 불가능하고, 프로그램이 실행될 때의 정보를 통해서만 객체와 클래스의 정보를 알 수 있다는 문제를 해결할 수 있습니다. 달리기.

두 사람이 공동으로 개발할 경우 상대방의 클래스명만 알면 예비 개발이 진행됩니다.

클래스 객체 가져오기

  • Class.forName(String clazzName) 정적 메서드

  • 클래스의 클래스 속성 호출 , Person. 클래스는 Person 클래스 객체를 반환합니다(권장)

  • 객체의 getClass() 메서드 호출

특정 용도 여전히 실제 상황에 따라 선택해야 합니다. 첫 번째 방법은 클래스 이름만 알면 됩니다. 두 번째 및 세 번째 방법은

클래스 정보 가져오기

클래스 생성자 가져오기

  • Connstructor8742468051c85b06f0a0af9e3e506b5c getConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes): 지정된 형식 매개변수를 사용하여 이 Class 객체의 해당 클래스를 반환합니다. 공용 생성자

  • Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getConstructors(): 이 클래스 객체에 해당하는 클래스의 모든 공용 생성자를 반환합니다.

  • Constructor8742468051c85b06f0a0af9e3e506b5c[] getDeclaredConstructor(Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes): 이 클래스 객체를 반환합니다. 해당 클래스의 지정된 매개변수가 있는 생성자

  • Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredConstructors(): 이 클래스 객체의 해당 클래스의 모든 생성자를 반환하고 생성자의 액세스 권한은 관련 없음

클래스 멤버 메소드 가져오기

  • Method getMethod(String name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes): 이 클래스 객체의 해당 클래스의 지정된 형식 매개변수를 사용하여 공용 메소드를 반환합니다

  • Method[] getMethods(): 이 클래스 객체가 나타내는 클래스의 모든 공개 메서드를 반환합니다.

  • Method getDeclaredMethod(string name,Class6b3d0130bba23ae47fe2b8e8cddf0195...parameterTypes): 이 클래스 객체에 해당하는 지정된 클래스를 반환합니다. 형식 매개변수의 메소드는 메소드 접근권한과 무관

  • Method[] getDeclaredMethods(): 이 클래스 객체의 해당 클래스의 모든 메소드를 반환하며, 메소드와는 아무런 관련이 없다. 접근 권한

클래스 멤버 변수 가져오기

  • Field getField(String name): 이 클래스 객체에 해당하는 지정된 이름의 공용 멤버 변수를 반환합니다

  • Field[] getFields(): 이 클래스 객체에 해당하는 클래스의 모든 공용 멤버 변수를 반환합니다.

  • Field getDeclaredField(String name): 지정된 멤버 변수를 반환합니다. 멤버 변수 접근 권한에 관계없이 이 클래스 객체에 해당하는 클래스 이름

  • Field[] getDeclaredFields(): 접근 권한에 관계없이 이 클래스 객체에 해당하는 클래스의 모든 멤버 변수를 반환합니다. 멤버 변수

클래스 주석 가져오기

  • ff56b21ab54c6b5c37cb9b57f821804eA getAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass): 클래스의 해당 클래스에 대한 지정된 유형의 Annotation을 가져옵니다. 유형 주석이 없으면 null

  • ff56b21ab54c6b5c37cb9b57f821804eA getDeclaredAnnotation(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass)을 반환합니다. 이는 Java 8의 새로운 기능입니다. 이 메서드는 해당 클래스를 직접 수정하는 지정된 유형의 주석을 가져옵니다. 클래스 객체가 없으면 null

  • Annotation[] getAnnotations()을 반환합니다. 수정하는 모든 주석

  • Annotation[] getDeclaredAnnotations()을 반환합니다. 이 클래스 객체의 해당 클래스: 이 클래스 객체의 해당 클래스를 수정하는 모든 주석을 반환합니다

  • ff56b21ab54c6b5c37cb9b57f821804eA[] getAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass): 이 메서드의 기능은 기본적으로 getAnnotation() 메서드와 유사합니다. 앞서 소개했지만 Java8에서는 반복 주석 기능을 추가했기 때문에 클래스를 수정하는 지정된 유형의 여러 주석을 얻으려면 이 방법을 사용해야 합니다

  • ff56b21ab54c6b5c37cb9b57f821804eA[] getDeclaredAnnotationByType(Class72d4ced2cc960a6bc2541984146fdaaaannotationClass): 이 메소드는 앞서 소개한 getDeclaredAnnotations() 메소드와 유사합니다. 이는 Java8의 반복 주석 기능 때문이기도 합니다. 다중 주석

  • 을 직접 수정하는 지정된 유형을 얻으려면 이 메소드를 사용해야 합니다.

이 클래스의 내부 클래스 가져오기

  • Class6b3d0130bba23ae47fe2b8e8cddf0195[] getDeclaredClasses(): 이 클래스 구성의 해당 클래스에 포함된 모든 내부 클래스를 반환

이 클래스의 객체가 있는 외부 클래스 가져오기

  • Class6b3d0130bba23ae47fe2b8e8cddf0195 getDeclaringClass(): Class 객체의 해당 클래스가 있는 외부 클래스를 반환

이 클래스 객체의 해당 클래스에 의해 구현된 인터페이스 가져오기

  • Class6b3d0130bba23ae47fe2b8e8cddf0195[] getInterfaces(): 이 클래스 객체의 해당 클래스에 의해 구현된 모든 인터페이스를 반환합니다

이 클래스 객체의 해당 클래스에 상속된 상위 클래스를 가져옵니다

  • Class117c5a0bdb71ea9a9d0c2b99b03abe3e getSuperclass(): 해당 클래스의 상위 클래스의 Class 객체를 반환합니다. 이 클래스 객체의

이 클래스 객체의 해당 클래스에 대한 수정자, 패키지, 클래스 이름 등과 같은 기본 정보를 가져옵니다

  • int getModifiers(): 이 클래스 또는 인터페이스를 반환합니다. 모든 수정자는 public, protected, private, final, static, abstract 등 해당 상수로 구성됩니다. 반환된 정수는 다음 메서드를 사용하여 디코딩해야 합니다. 실제 수정자를 얻기 위한 수정자 도구 클래스

  • Package getPackage(): 이 클래스의 패키지를 가져옵니다.

  • String getName(): 이 CLAs를 반환합니다. String 형식으로 객체가 표현하는 클래스의 약어

클래스가 인터페이스, 열거형, 주석형인지 확인

  • boolean isAnnotation(): 이 클래스 반환 객체가 주석 유형을 나타내는지 여부

  • boolean isAnnotationPresent(Classe7efc8cbc31a41b0598dead74d6893ddannotationClass): 이 클래스 객체가 클래스 주석으로 장식되었는지 확인

  • boolean isAnonymousClass(): 이 클래스를 반환합니다. 객체가 익명 클래스

  • boolean isArray()인지 여부를 반환합니다. 배열클래스

  • boolean isEnum()을 나타냅니다. 이 클래스 객체가 열거형

  • boolean isInterface()을 나타내는지 여부를 반환합니다. 이 클래스 객체가 인터페이스를 나타내는지 여부를 반환합니다.

  • boolean isInstance(<a href="http://www.php.cn/wiki/60.html" target=" _blank">Object<code>boolean isInstance(<a href="http://www.php.cn/wiki/60.html" target="_blank">Object</a> obj) obj): obj 결정 이 클래스 개체의 인스턴스인지 여부에 관계없이 이 메서드는 operator

instanceof

operator结果를 완전히 대체할 수 있습니다.

public interface Colorable {
     public void value();
}
    Java8의 새로운 기능 메서드 매개변수 반영
  • int getParameterCount()

  • : 생성자 또는 메서드의 형식 매개변수 개수 가져오기
  • Parameter[] getParameters()

  • : 생성자 또는 메소드의 모든 형식 매개변수를 가져옵니다.
  • getModifiers()

  • : 형식 매개변수를 수정하는 수정자를 가져옵니다.
  • String getName()

  • : 형식 매개변수 이름 가져오기
  • Type getParameterizedType()

  • : 제네릭을 사용하여 형식 매개변수 유형 가져오기
  • Class6b3d0130bba23ae47fe2b8e8cddf0195getType()

  • : 형식 매개변수 유형을 가져옵니다.
  • boolean isNamePresent()

  • : 해당 클래스의 클래스 파일에 해당 메서드의 형식 매개변수 이름 정보가 포함되어 있는지 여부를 반환합니다.
  • boolean isVarArgs()

  • : 이 방법은 매개변수가 가변 개수의 형식 매개변수인지 여부를 확인하는 데 사용됩니다

结果

public class ClassInfo {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        Class<Colorable> cls=Colorable.class;
        System.out.println(cls.getMethod("value"));
        System.out.println(cls.isAnnotation());
        System.out.println(cls.isInterface());
    }

}
public abstract void com.em.Colorable.value()
false
true

public class Test {
    public void getInfo(String str,List<String>list){
        System.out.println("成功");
    }
}
    반사 생성 객체
  • 클래스 사용 객체의 newInstance() 메서드는 Class 객체의 인스턴스를 생성합니다. 이 메서드에는 기본 생성자(더 일반적으로 사용됨)가 필요합니다. 🎜>
  • 먼저 Class 개체를 사용하여 지정된 Constructor 개체를 얻은 다음 Constructor 개체를 호출합니다. newInstance() 메서드를 사용하여 Class 개체의 해당 클래스 인스턴스를 만듭니다.

Reflection 호출 메서드

  • Object invoke(Object obj,Object...args): 이 메서드의 obj는 메서드를 실행하기 위한 기본 호출이며, 다음 인수는 다음과 같은 경우 메서드에 전달되는 실제 매개 변수입니다. 메소드 실행

public class ClassInfo {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        Class<Test> cls=Test.class;
        Method med=cls.getMethod("getInfo", String.class,List.class);
        System.out.println(med.getParameterCount());
        Parameter[] params=med.getParameters();
        System.out.println(params.length);
        for(Parameter par:params){
            System.out.println(par.getName());
            System.out.println(par.getType());
            System.out.println(par.getParameterizedType());
        }
    }

}
2
2
arg0
class java.lang.String
class java.lang.String
arg1
interface java.util.List
java.util.List<java.lang.String>

结果

public class Test {

    public Test(String str) {
        System.out.println(str);
    }
    public void getInfo(String str){
        System.out.println(str);
    }
}

다음 공식을 볼까요 아래 밤나무를 잘 보세요

public class ClassInfo {

    public static void main(String[] args) throws Exception {
        Class<Test> cls=Test.class;
        Constructor<Test>construct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
        Method med=cls.getMethod("getInfo", String.class);
        med.invoke(test, "调用方法成功");
    }

}
初始化
调用方法成功

结果

public class Test {

    public Test(String str) {
        System.out.println(str);
    }
    //私有方法
    private void getInfo(String str){
        System.out.println(str);
    }
}

setAccessible(boolean flag): 값을 true로 설정하여 이 메소드 검사

액세스 멤버 변수 값

을 사용할 때 Java 언어 액세스 권한을 취소해야 함을 나타냅니다.
  • getXxx(Object obj): obj 객체의 멤버 변수 값을 가져옵니다. 여기서 Xxx는 8가지 기본 유형에 해당합니다. 멤버 변수의 유형이 참조 유형인 경우 Xxx 부분

  • setXxx(Object obj,Xxx val)을 제거합니다. obj 객체를 변경합니다. 멤버 변수는 val 값으로 설정됩니다. 여기서 Xxx는 8가지 기본타입에 해당합니다. 멤버변수의 타입이 참조타입이라면 set

후 Xxx를 취소하면 됩니다. 개인 멤버 변수를 포함한 변수

public class ClassInfo {

    public static void main(String[] args) throws Exception {
        Class<Test> cls=Test.class;
        Constructor<Test>construct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
      //为啥使用这个方法呢?
        Method med=cls.getDeclaredMethod("getInfo", String.class);
      //为啥使用这个方法呢?
        med.setAccessible(true);
        med.invoke(test, "调用方法成功");
    }

}
初始化
调用方法成功

结果

public class Test {
    private int num;

    public Test(String str) {
        System.out.println(str);
    }
    private void getInfo(String str){
        System.out.println(str);
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }

}

연산 배열

java.lang.reflect 패키지 아래에 Array 클래스가 있습니다. 동적으로 배열을 생성할 수 있는

static Object newInstance(Class6b3d0130bba23ae47fe2b8e8cddf0195componentType,int...length): 지정된 요소 유형과 지정된 크기로 새 배열을 생성합니다

static xxx getXxx(Object array,int index):返回array数组中第index个元素。其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为get()

static void setXxx(Object array,int index,xxx val):将array数组中低index 个元素的值设为val,其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为set()

public class ArrayInfo {

    public static void main(String[] args) {
        Object arrays=Array.newInstance(String.class, 3);
        Array.set(arrays, 0, "第一个");
        Array.set(arrays, 1, "第二个");
        Array.set(arrays, 2, "第三个");
        System.out.println(Array.get(arrays, 2));
    }
}

위 내용은 클래스 및 객체 정보를 얻기 위한 Java 리플렉션에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.