1. 소개
Java Reflection은 런타임에 클래스 방법, 속성, 부모 클래스, 인터페이스 등의 내부 정보를 얻을 수있는 메커니즘입니다. 다시 말해, 반사는 본질적으로 "역"프로세스입니다. 우리가 new 통해 클래스 인스턴스를 만들 때, 그것은 실제로 런타임시이 클래스의 Class 객체를 기반으로 Java 가상 머신에 의해 구축되며, 반사는 클래스의 Class 객체를 통해 정의 정보를 얻는 것입니다. 그래서 우리는 그 속성과 방법에 액세스하고,이 클래스의 상위 클래스를 알 수 있습니다.
2. 수업
Javac을 사용하면 .java 파일을 .class 파일로 컴파일 할 수 있으며 클래스에 대한 원래 정의 정보가 포함되어 있습니다 (부모 클래스, 인터페이스, 생성자, 속성, 메소드 등). .class 파일은 런타임에 ClassLoader JVM (Java Virtual Machine)에로드됩니다. .class 파일이로드되면 JVM은 클래스 객체를 생성합니다. 우리가 프로그램에서 새로운 것을 통해 인스턴스화하는 객체는 실제로 런타임의 해당 클래스 객체를 기반으로 구성됩니다. 정확하게 말하면,이 클래스 객체는 실제로 java.lang.Class<T> generic class의 인스턴스입니다. 예를 들어, Class<MyClass> 객체는 MyClass 클래스의 정의 정보를 캡슐화하는 Class<T> 인스턴스입니다. java.lang.Class<T> 클래스에는 공개 생성자가 없으므로이 클래스를 직접 인스턴스화 할 수 없습니다. 다음 방법을 통해 클래스 객체를 얻을 수 있습니다.
다음 설명에서, 우리는 사람들의 수업과 학생 수업을 예로들 것입니다.
공개 클래스 사람들 {개인 문자열 이름; 사적인 int 연령; 공개인 (문자열 이름, int age) {this.name = 이름; this.age = age; } public int getage () {반환 연령; } public String getName () {return name; } public void 설정 (int Age) {this.age = age; } public void setName (문자열 이름) {this.name = 이름; } public void speak () {System.out.println (getName () + "" + getage ()); }} 공개 클래스 학생은 사람들을 확장합니다 {private int grade; 공개 학생 (문자열 이름, int age) {Super (이름, 나이); } 공개 학생 (문자열 이름, int age, int grade) {super (이름, 나이); this.grade = 등급; } public int getgrade () {return grade; } public void setgrade (int grade) {this.grade = grade; } private void Learn (문자열 코스) {system.out.println (이름 + "x legon" + course); }} 클래스 이름으로 클래스 객체를 얻습니다
컴파일 기간 동안 클래스의 이름을 알고 있다면 다음과 같은 클래스 객체를 얻을 수 있습니다.
클래스 <peopleclass = people.class;
다음과 같이 클래스의 전체 경로 이름을 기반으로 클래스 객체를 얻는 방법도 있습니다.
// 사람 클래스가 com.test 패키지 클래스 <people> peopleclass = class.forname ( "com.test.people")에 있다고 가정합니다.
Class.forName() 메소드의 매개 변수는 클래스의 전체 경로 이름이어야합니다. 실제로, 우리가 "com.test.people"을 가져 오는 한, 전체 경로를 쓰지 않고 " People.class "를 통해 클래스 객체를 직접 얻을 수 있습니다. ( Class.forName() 메소드를 호출 할 때 해당 클래스가 classpath 에서 찾을 수없는 경우 ClassNotFoundException 발생합니다.)
객체 자체를 통해 클래스 객체를 얻으십시오
사람들의 = 새로운 사람 ( "Bill", 18); 클래스 <peopleclass = people.getClass ();
반사로 클래스의 생성자를 얻으십시오
People 의 수업 대상을 얻으면이 클래스 객체를 통해 People 수업의 원래 정의 정보를 얻을 수 있습니다. 먼저 People 클래스의 생성자 객체를 얻을 수 있습니다. 이 생성자 객체를 사용하면 People Object를 구성 할 수 있습니다. 예를 들어 Student.java에 다음 코드를 추가 할 수 있습니다.
public static void main (String [] args) {class <people> pclass = people.class; {생성자 <people> 생성자 = pclass.getConstructor (String.class, int.class); 사람 People = Constructor.newinstance ( "Bill", 18); obj.speak (); } catch (예외 E) {}} 위에서는 getConstructor 메소드를 호출하여 People 클래스의 생성자 객체를 얻습니다. 생성자는 유형 String 과 int 의 공식 매개 변수를 얻으려면 String.class 및 int.class 를 전달합니다. 생성자 객체를 사용하면 newInstance 메소드를 호출하여 people Object를 만들 수 있습니다.
클래스의 Constructor , Method 및 Field 객체를 반사를 통해 얻을 때,이 객체의 방법을 호출하기 전에이 객체의 accessible 플래그는 Java 언어 액세스 점검을 true 하여 반사 속도를 향상시킬 수 있습니다. 다음 코드에 표시된대로 :
생성자 <people> 생성자 = peopleclass.getConstructor (String.class, int.class); // 생성자의 액세스 가능한 속성을 ture로 설정하여 Java 액세스 확인 생성기를 취소하기 위해 ture로 설정합니다.
반사를 통해 수업에서 선언 된 방법을 얻는다
현재 클래스에서 선언 된 방법을 가져옵니다 (부모 클래스에서 상속 된 제외)
현재 클래스에서 모든 방법을 선언하려면 클래스에서 getDeclaredMethods 함수를 사용할 수 있습니다. 현재 클래스 ( private , public , static 및 기타 방법 포함)에서 모든 방법을 선언합니다. Method 개체 배열을 반환하고 각 Method 객체는 클래스에서 선언 된 메소드를 나타냅니다. 지정된 메소드를 얻으려면 getDeclaredMethod(String name, Class...<T> parameterTypes) 호출 할 수 있습니다.
다음 코드에 표시된대로 :
개인 정적 void showdeclaredMethods () {학생 학생 = 신입생 ( "Bill", 18); // 학생 클래스 메소드에 의해 선언 된 모든 메소드를 가져옵니다 [] method = whiting.getClass (). getDeclaredMethods (); 시도 {// LearnMethod 객체를 가져옵니다 (학습 메소드 캡슐화) 메소드 LearnMethod = whening.getClass (). getDeclaredMethod ( "LEART", String.Class); // 학습 메소드의 매개 변수 목록을 가져 와서 클래스 <?> [] paramclasses = learnMethod.getParameterTypes (); for (class <?> class : paramclasses) {system.out.println ( "학습 메소드 매개 변수 :" + class.getName ()); } // Learn 메소드가 개인 System.out.println인지 판단합니다 (LearnMethod.getName () + " +" + modifier.isprivate (learnMethod.getModifiers ())); // LEART MOBORD LEARTMETHOD.INVOKE (Student, "Java Reflection")를 호출합니다. } catch (예외 E) {}} 현재 클래스와 부모 수업에서 선언 된 공개 방법 받기
부모 클래스에서 현재 클래스 및 모든 public 방법을 얻으려면 getMethods 함수를 호출하고 지정된 public 메소드를 얻으려면 getMethod 메소드를 호출 할 수 있습니다. 다음 코드를 참조하십시오.
개인 정적 무효 ShowMethods () {Student Student = New Student ( "Mr.Simple"); // 모든 공개 방법을 가져옵니다 (학생 자체를 포함하여 부모 클래스에서 상속) 메소드 [] method = whening.getClass (). getMethods (); {// try {// getMethod를 통해 공개 방법 만 얻을 수 있습니다. 개인 방법을 얻으려고하면 예외가 발생합니다. 메소드 LEARNMETHOD = Student.getClass (). getMethod ( "LEART", String.Class); } catch (예외 E) {}} 반사로 클래스에 정의 된 속성을 가져옵니다
getMethods() / getDeclaredMethods() 메소드에 대한 호출이 getFields() / getDeclaredFields() 메소드로 호출로 대체된다는 점을 제외하고는 속성을 얻는 것이 메소드를 얻는 것과 유사합니다.
현재 클래스에 정의 된 속성을 가져옵니다 (부모 클래스에서 상속 된 속성 제외).
현재 클래스에 정의 된 모든 속성 ( private , public , static 등과 같은 다양한 속성 포함)을 얻으려면 클래스 객체의 getDeclaredFields 함수를 호출 할 수 있습니다. 지정된 속성을 얻으려면 getDeclaredField 로 호출 할 수 있습니다.
다음 코드에 표시된대로 :
개인 정적 무효 showdeclaredfields () {학생 학생 = 신입생 ( "Bill", 18); // 현재 클래스 필드에 정의 된 모든 속성을 가져옵니다 [] fields = whiting.getClass (). getDeclaredFields (); 시도 {// 지정된 속성을 가져옵니다. 필드 필드 = whient.getClass (). getDeclaredfield ( "grade"); // 속성 값 system.out.println을 가져옵니다 ( "등급은 :" + gradefield.getint (학생)); // 속성 값 value gradefield.set (Student, 10)을 설정합니다. } catch (예외 E) {}} 현재 클래스 및 부모 클래스에 정의 된 공개 속성을 얻으십시오.
현재 클래스 및 상위 클래스에 모든 public 속성을 정의하려면 Class 객체의 getFields 함수를 호출 할 수 있습니다. 지정된 public 재산을 얻으려면 다음 코드와 같이 getField 메소드를 호출 할 수 있습니다.
개인 정적 무효 ShowFields () {학생 학생 = 신입생 ( "Bill", 18); // 현재 클래스 및 상위 클래스 필드의 모든 공개 속성을 가져옵니다 [] publicfields = Student.getClass (). getFields (); } 클래스의 상위 클래스를 얻기위한 반사 및 클래스에서 구현 한 인터페이스
부모 수업을 받으십시오
다음 코드와 같이 Class 객체의 getSuperClass 메소드를 호출하십시오.
학생 학생 = 신입생 ( "Bill", 18); class <?> superclass = student.getClass (). getSuperClass ();
구현 된 인터페이스를 가져옵니다
클래스가 구현하는 인터페이스를 알려면 다음 코드와 같이 Class 객체의 getInterfaces 메소드를 호출하십시오.
개인 정적 무효 ShowInterfaces () {Student Student = New Student ( "Bill", 19); class <?> [] interfaces = Student.getClass (). getInterfaces ();}요약
위는이 기사의 전체 내용입니다. 모든 사람의 연구와 일에 도움이되기를 바랍니다.