Java 반사 메커니즘은 모든 클래스의 경우,이 클래스의 모든 속성과 방법을 알 수 있습니다. 객체 방법을 Java 언어의 반사 메커니즘이라고합니다. 반사의 개념은 1982 년 Smith가 처음 제안했으며, 주로 프로그램이 자체 상태 또는 행동에 액세스, 탐지 및 수정할 수있는 능력을 언급합니다. 이 개념의 제안은 컴퓨터 과학 분야의 적용 반사율에 대한 연구를 신속하게 유발했습니다. 그것은 프로그래밍 언어 설계 분야에서 처음 채택되었으며 LISP 및 객체 지향에서 성과를 달성했습니다. 물론 반사 자체는 새로운 개념이 아닙니다.
Java 반사 메커니즘은 주로 다음과 같은 용도를 제공합니다.
런타임에 객체가 속한 클래스 결정
런타임에 클래스의 객체를 구성하십시오
런타임에 클래스의 멤버 변수 및 메소드 결정
런타임시 객체의 호출 방법
먼저 간단한 예제를 살펴 보고이 예제를 사용하여 Java의 반사 메커니즘이 어떻게 작동하는지 이해해 봅시다.
package com.wanggc.reflection; import java.lang.reflect.method;/*** java 반사 연습. * * @author wanggc * /public class fornameTest { /** * 입력 함수. * * @param args * 매개 변수 * @throws 예외 * 오류 메시지 */ public static void main (String [] args) 예외 {// 클래스 클래스 get <?> cls = class.fornam e (args [0]); / / 클래스 메소드를 통해 해당 객체를 얻습니다. [] methods = cls.getMethods ();전달 된 매개 변수가 java.lang.string이면 다음 결과가 출력됩니다.
Public Boolean java.lang.string.equals (java.lang.object) public java.lang.string java.lang.string.tostring () public int java.lang.string.hashcode () pu blic int java.lang.string . int) public int java.lang.string.indexof (java.lang.string) public int java.lang.string.indexof (java.lang.string, int) public static java.lang.string java.lang .string.valueof (int) public static java.lang.string java.lang.string.valueof (char) public static java.lang.string java.lang.string java.lang.string.valueof (부울) 공개 정적 java.lang.st ring java.lang.string.valueof (float) public static java.lang.string java.lang.string.valueof (char [], int, int) public static java.lang.string java.lang.string.valueof (double) public s tatic java.lang.string java .lang.string.valueof (char []) public static java.lang.string java.lang.string.valueof (java.lang.object) public java.lang.string java. lang.string. valueof (long) public char java.lang.string.charat (int) public int java.lang.string.codepointat (int) public int java.lang.string.codepointbeforefore forefore (int) public java.lang. string.codepointCount (int, int) public int java.lang.string.comparetoignorecase (java.lang.string) public java.lang.string java.lang.string.concat (java.lang.string) public boolean java.lang .String .Crontains (java.lang.charedecence) public boolean java.lang.string.contentequals (java.lang.charecedence) public boolean java.lang.string.contentequals (java.lang.stringbuffer) public stati c java.lang. String java.lang.string.copyvalueof (char []) public static java.lang.string java.lang.string.copyvalueof (char [], int) public boolean java.lang.string.endswith (java.lang. 문자열) public boolean java.lang.string.equalsignorecase (java.lang.string) public static java.lang.string java.lang.string.format (java.lang.string, java.lang.object []) public static java .lang.string java.lang.st ring.format (java.util.locale, java.lang.string, java.lang.object []) public byte [] java.lang.string.getbytes (java.lang.string ) java.io.unsupportedenc eldexceptionpublic void java.lang.getBytes (int, int, byte [], int) public byte [] java.lang.string.getBytes () public byte [] java.lang.string. getBytes (java.nio.charset.char set) public void java .lang.string.getchars (int, int, char [], int) public ava.lang.string java.lang.string.intern () public boolean java .lang.string.isempty () public int j ava.lang.lastindexof (java.lang.string) public java.lang.string.lastindexof (int) public int java.lang.string.lastindexof (int ) Public Int Java.lan G.String.lastindexof (java.lang. String, int) public int java.lang.string.length () public boolean java.lang.string.matches (java.lang.string) 공개 int Java .lang.string.offsetByCodePoin ts (int, int) public boolean java.lang .string.gregionMatches (boolean, int, java.lang.string, int, int) public boolean java.lang.string.regionmatches (int, int, java.lang.string, int, int) public java.lan g.string java.lang .string.replace (java.lang.charevesence, java.lang.charedecence) public java.lang.string java.lang.string.replace (char, char) public java.lang.string java .lang.string.replaceall (java .lang.string, java.lang.string) public java.lang.string java.lang.string.replacefirst (java.lang.string , java.lang.string) public java.lang.string [] java.lan g.string .split (java.lang.string) public java.lang.string [] java.lang.string.split (java.lang. String, int) public boolean java.lang.string.startswith (java.lang.st ring) public boolean java.lang.string.startswith (java.lang.string, int) public java.lang.charedeced java.lang.string .Subsequence (int, int) public java.lang.string j ava.lang.string.substring (int) public java.lang.string java.lang.string.substring (int, int) public char [] java.lang. String.tocharray () public java.lang.string java.lang.string.tolow ercase () public java .string java.lang.string.touppercase () public java.lang.string java.lang.string ing.touppercase (java.util. locale) public java.lang.string java.lang.string.trim () 공개 최종 원주민 void java.lang.object.wait (long)은 java.lang.lang.interruptedexceptionpub LIC 최종 void void java.lang.object.wait를 던지는 java .lang.lang.interruptedExceptionpublic void java.lang.object.wait (long, int) srows java.lang.interruptedexceptionpublic 최종 기본 java.lang.cla ss java.lang.object.getclass () 공개 최종 기본 void java.lang.object () 공개 최종 기본 void java.lang.object.notifyall ().
여기에는 모든 메소드 이름, 제한 문자, 반환 유형 및 Java.lang.string 클래스의 예외가 나와 있습니다. 이 프로그램은 클래스 클래스 ForName 메소드를 사용하여 지정된 클래스를로드 한 다음 GetMethods 메소드를 호출하여 지정된 클래스의 메소드 목록을 반환합니다. java.lang.reflect.method는 특정 클래스에서 단일 메소드를 표현하는 데 사용됩니다.
Java의 반사 메커니즘을 사용하면 일반적으로 세 가지 단계가 필요합니다.
첫 번째 단계에서 얻은 클래스 객체를 통해 클래스를 조작하려는 클래스 객체를 얻으려면 클래스의 메소드 또는 클래스 이름 작동의 두 번째 단계에서 얻은 메소드 또는 속성을 얻습니다.
Java가 실행될 때, 특정 클래스가 생성하는 객체 수에 관계없이, 동일한 클래스 객체에 해당하며, 이는 실행중인 클래스 및 인터페이스를 나타내는 동일한 클래스 객체에 해당합니다. 작업 클래스의 클래스 객체를 얻는 세 가지 일반적인 방법이 있습니다.
위의 예와 같이 클래스의 정적 메소드 Forname을 호출하십시오.
클래스의 .class 구문을 사용하십시오. 클래스 <?> cls = string.class;
문자열 str = "abc"; cls = str .getclass ();
다음은 위에서 언급 한 세 단계를 통해 특정 객체의 특정 방법을 실행하는 방법을 설명하기 위해 예제를 사용합니다.
com.wanggc.reflection; * * @author wanggc */ public static void main (string [] args)은 {display display = new display (); 클래스 메소드를 통해 디스플레이 클래스의 쇼 메소드를 가져옵니다 void show (문자열 이름) {System.out.println ( "hello :" + name)};앞에서 언급했듯이 각 클래스의 Java 프로그램에는 그에 해당하는 클래스 객체가 있습니다. Java Reflection의 첫 번째 단계는 14 줄의 코드와 같은이 클래스 객체를 얻는 것입니다. 물론 각 클래스의 메소드에는 해당 메소드 객체도 있어야합니다. 반사를 통해이 메소드를 호출하려면 먼저 코드의 16 행과 같은이 메소드의 메소드 개체를 얻은 다음 메소드 객체를 사용하여 코드의 18 행과 같이이 메소드를 호출해야합니다. 16 행의 getMethod 메소드의 첫 번째 매개 변수는 메소드 이름이며, 두 번째는이 메소드의 매개 변수 유형입니다. 18 줄의 코드를 실행하십시오. 이는 실제로 호출의 첫 번째 매개 변수는 디스플레이 클래스의 객체, 즉 디스플레이 클래스의 객체가 호출되는지입니다 매개 변수는 쇼 메소드에 전달됩니다. 유형과 숫자는 16 줄의 getMethod 메소드와 일치해야합니다.
위의 예는 반사를 통해 특정 클래스의 메소드를 호출하는 방법을 보여줍니다.
com.wanggc.reflection; java.lang.reflect.field; * * @author wanggc */ public class reflectiontest {public static void main (String [] args) 예외 {// 학생 객체 학생 = new 학생들 (); Student.setStuage (); ) + ":" + deststudent.getStuage ()); * * * @param from * 소스 객체 복사 * @param dest * 대상 객체 복사 * @throws 예외 * 예외 */ private static void coberbean (Object From, Object Dest) 예외 {// 사본의 클래스 개체 가져옵니다. 소스 객체 클래스 <?> from.getClass (); > dest.getClass (); forffield : fromfields) 사본 대상 객체 DESTCER LASS.GETDECLAREDFIELD (이름); object to the corresponding attribute of the copy target object destField.set(dest, fromField. : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : ;}}} /*** 학생 수업. * / 클래스 학생 { / ** 이름* / 개인 문자열; / ** 개인 이름; ** @return 학생 이름*/ public string getStuname () {return stuname}/ *** set student name** @param setstuname*/ public void setstuname (String st uname) {this.stuname = stuname; } / *** 학생 연령을 얻으십시오** @return 학생 연령* / public int getStuage () {return stuage} / *** @param stuage* 학생 연령* / public void setStuage (int st uage ) {this.stuage = stuage}}Java 런치 메커니즘에서 클래스는 클래스에 해당하고 클래스 방법은 메소드에 해당하며 물론 속성은 필드에 해당합니다. 코드의 의견은 자세히 설명되어 있으며 여기서는 반복되지 않습니다. 그러나 필드는 속성의 값을 얻고 설정하기위한 get and set 메소드를 제공하지만 속성은 개인 유형이므로 속성의 접근성은 암호. 전체 필드에 대한 접근성을 설정하고 다음과 같은 40 줄에서 AccessibleObject SetAccessible의 정적 메소드를 사용할 수 있습니다.
이전 설명은 Java 반사 메커니즘을 사용하여 클래스의 방법과 속성을 작동하는 방법을 보여줍니다.
com.wanggc.reflection; java.lang.reflect.field; * * @author wanggc */ public class reflectiontest {public static void main (String [] args) 예외 {// 학생 객체 학생 = new 학생들 (); Student.setStuage (); ()); ostudent 객체 정보를 복사합니다. * * @param from * 소스 객체 복사 * @param dest * 대상 객체 복사 * @throws 예외 */ private static 객체 coberbean (Object from) 예외 {// 소스 객체 클래스의 복사 클래스 개체 가져옵니다. ?> from.getClass (); (); for (field : fromfields) {// setAccessible에서 속성의 접근성을 설정합니다. ints, fromfield.get (from)} ints}}* 학생 클래스. * / 클래스 학생 { / ** 이름* / 개인 문자열; / ** 개인 이름; ** @return 학생 이름*/ public string getStuname () {return stuname}/ *** set student name** @param setstuname*/ public void setstuname (String st uname) {this.stuname = stuname; } / *** 학생 연령을 얻으십시오** @return 학생 연령* / public int getStuage () {return stuage} / *** @param stuage* 학생 연령* / public void setStuage (int st uage ) {this.stuage = stuage}}이 예제와 이전 예제의 결과는 동일합니다. 그러나 Copybean 메소드에 의해 반환 된 객체는 더 이상 외부에서 전달되지 않지만 40 행의 코드에 표시된 것처럼 내부적으로 방법에 따라 내부적으로 생성됩니다. 참고 : 클래스의 NewInstance 메소드는 매개 변수가없는 생성자를 포함하는 클래스 만 만들 수 있습니다. Wanggc ");
이 시점에서 Java 반사 메커니즘 (런타임시 객체를 호출하는 방법, 클래스 속성 사용 및 클래스 객체 생성)의 공통 기능이 소개되었습니다.
보충 : 클래스의 방법, 속성 및 생성자를 얻을 때 GetXxx 및 GetGetDeclaredxxx의 두 가지 해당 방법이 있습니다. 차이점은 전자가 학부모 클래스를 포함하여 방법과 속성을 공개적으로 반환한다는 것입니다.
위의 내용은 당신에게 소개 된 Java 런칭 메커니즘입니다. 나는 당신이 그것을 좋아하기를 바랍니다.