이 기사에서는 Java 프로그래밍 반사 메커니즘의 사용에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
서문 : 반사 : 클래스 (이 기사에서 person.class와 같은 바이트 코드 파일)를 동적으로 얻고 멤버를 실행하십시오. 안드로이드 애플리케이션 계층의 개발에서 반사는 약간 덜 만날 수 있지만, 기본 레이어를 통과하려는 사람들에게는이를 사용하는 데 능숙해야합니다.
엔티티 클래스
사람. 자바
package com.sunwenou.reflect; // 패키지 이름 공개 클래스 사람 {개인 문자열 이름; 사적인 int 연령; public person () {// 매개 변수 없음} public person (string name, int age) {// parameter super (); this.name = 이름; this.age = age; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public int getage () {반환 연령; } public void 설정 (int Age) {this.age = age; } @override public String toString () {return name+","+age; } public void show () {// 빈 매개 변수 System.out.println ( "show"); } public void fun (string ss) {// 매개 변수 system.out.println (ss); } public static void function () {// static system.out.println ( "static"); }}바이트 코드 파일을 동적으로 얻는 방법
블로그 게시물을 간결하게 보이게하려면 예외가 발생하고 수입은 아래에 동일하게 생략됩니다.
패키지 com.sunwenou.reflect; public class demo1 { /*** 바이트 코드 파일을 동적으로 얻는 방법* 1 : 객체 클래스에서 제공 한 클래스 getClass () 메소드 사용*이 메소드* 2 : 각 데이터 유형은 정적 클래스 속성을 가지고 있으며이 속성에 의해 반환되는 데이터 유형은 Classs* 3 : class* 3에 의해 제공됩니다. 패키지 이름 + 클래스 이름*/public static void main (String [] args)으로 구성된 문자열이 필요합니다. 예외 {// getClaz (); // getCalz2 (); getClaz3 (); } // 클래스 공개 static void getclaz3 ()가 제공하는 forname () 메소드를 사용하여 예외 {class <?> claz = class.forname ( "com.sunwenou.reflect.person"); class <?> claz2 = class.forname ( "com.sunwenou.reflect.person"); System.out.println (claz == claz2); } // 각 데이터 유형에는 정적 클래스 속성이 있습니다. 공개 정적 void getCalz2 () {class <person> p1 = person.class; 클래스 <person> p2 = person.class; System.out.println (p1 == p2); } // 객체 클래스가 제공 한 클래스 getClass () 메소드를 사용하여 공개 정적 무효 getClaz () {person perient1 = new person (); 클래스 <? person> claz = person1.getclass (); // person.class person2 = new person (); 클래스 <? person> claz2 = person2.getclass (); // person.class system.out.println (claz == claz2); }}동적으로 수업을 받고 개체를 만듭니다
package com.sunwenou.reflect; public class demo2 {public static void main (String [] args)은 예외 {// createobj (); createobj2 (); } public static void createobj2 () 예외 {// person person = new person ( "lisi", 23); // bytecode 파일 객체 class <?> claz = class.forname을 가져옵니다 ( "com.sunwenou.reflect.person"); //person.class // 매개 변수가있는 생성자 메소드가 속한 유형 생성자의 객체를 가져옵니다. 생성자 생성자 = claz.getConstructor (String.class, int.class); // 생성자 클래스 개인이 제공 한 객체를 생성하는 방법을 사용하여 객체를 만듭니다. person = (person) constructor.newinstance ( "lisi", 23); System.out.println (사람); } public static void createobj ()는 예외를 던집니다. {// person person = new person (); // bytecode 파일 객체 class <?> claz = class.forname을 가져옵니다 ( "com.sunwenou.reflect.person"); Object obj = claz.newinstance (); // 기본적으로 빈 매개 변수의 생성자를 사용하여 개체 시스템을 만듭니다. out.println (obj); }}동적으로 클래스를 얻고 멤버 변수에 값을 할당합니다.
package com.sunwenou.reflect; public class demo3 {public static void main (String [] args)은 예외 {// person p = new person (); //p.name = "Lisi"; // bytecode 파일 객체 class <?> claz = class.forname을 가져옵니다 ( "com.sunwenou.reflect.person"); // 멤버 변수가 속한 필드 유형의 객체를 가져옵니다. // 필드 필드 = claz.getfield ( "name"); // 공개 허가 필드 필드 = claz.getDeclaredfield ( "name"); // 모든 선언 된 필드 System.out.println (Field); // 비 정적 멤버 변수는 오브젝트 obj = claz.newinstance ()에 의존하는 객체입니다. field.setAccessible (true); // Brute Force Cracking, Accessible Field.Set (OBJ, "Zhang San"); System.out.println (OBJ); }}동적으로 클래스를 얻고 메소드를 실행하십시오
package com.sunwenou.reflect; public class demo4 {public static void main (String [] args)은 예외 {// method1 (); 방법 2 (); 방법 3 (); } public static void method3 ()는 예외를 던집니다 {// bytecode 파일 객체 class <?> claz = class.forname ( "com.sunwenou.reflect.person"); 메소드 m = claz.getMethod ( "function", null); M.Invoke (null, null); } //// 매개 변수로 메소드를 실행 공개 static void method2 ()는 예외를 던집니다 {// bytecode 파일 객체 class <?> claz = class.forname ( "com.sunwenou.reflect.person"); 메소드 m = claz.getMethod ( "fun", String.class); Object obj = claz.newinstance (); M.Invoke (obj, "hello"); } // 매개 변수없이 메소드를 실행합니다 public static void method1 ()는 예외를 던져 {// person person = new person (); person.show (); // bytecode 파일 객체 class <?> claz = class.forname을 가져옵니다 ( "com.sunwenou.reflect.person"); // 실행 된 메소드가 속한 바이트 코드 파일 개체를 가져옵니다. 메소드 m = claz.getMethod ( "show", null); // 비 정적 메소드는 객체 obj = claz.newinstance ()에 의존하는 객체입니다. // 메소드 실행 메소드 M.Invoke (OBJ, NULL); }}이것은 반사의 기본 사용입니다. 객체를 정상적으로 생성하고 실행할 수 없을 때 객체의 바이트 코드 파일을 통해 객체를 만들 수 있습니다. 당신은 그것을하는 방법을 배웠습니까? ?
Java 관련 컨텐츠에 대한 자세한 내용은이 사이트의 주제를 확인하십시오. "Java 객체 지향 프로그래밍에 대한 소개 및 고급 튜토리얼", "Java 데이터 구조 및 알고리즘에 대한 튜토리얼", "Java Operation Dom Node Skills의 요약", "Java 파일 및 디렉토리 운영 기술 요약"및 "Java Cache 운영 기술의 요약".
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.