English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서는 Java 프로그래밍 반영 메커니즘 사용법을 설명합니다. 여러분과 공유하고, 다음과 같이 참고합니다:
서론:뷰티파일: 동적 클래스 (뷰티파일 파일 예: 이 문서의 Person.class)을 가져와 그 멤버를 실행합니다. 반영은 Android 애플리케이션 레이어에서는 조금 덜 만나지만, 밑바탕을 터치하고 싶은 친구들에게는 반드시 숙달해야 할 기술입니다.
엔티티 클래스
Person.java
package com.sunwenou.reflect;// 패키지 이름 public class Person { private String name; private int age; public Person() {// 无参 } public Person(String name, int age) {// 파라미터가 포함된 super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(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() { // 정적 System.out.println("static"); } }
동적이게 byte code 파일을 가져오는 방법
이 기사에서는 블로그가 간결하게 보이도록 일반적으로 Exception을 던지고 import를 생략합니다. 이하도 마찬가지입니다.
package com.sunwenou.reflect; public class Demo1 { /** * 동적이게 byte code 파일을 가져오는 방법 * 1: Object 클래스가 제공하는 Class getClass() 메서드를 사용합니다 * : 이 방법은 객체가 필요합니다 * 2: 각 데이터 타입에는 하나의 정적 class 속성이 있으며, 이 속성은 해당 데이터 타입의 byte code 파일 객체를 반환합니다 * int.class Person.class * 3: Class가 제공하는 forName() 메서드를 사용합니다 * 필요한 것은 단순히 문자열을 제공하면 됩니다. 이 문자열은 패키지 이름으로 구성되어 있습니다+클래스 이름 구성 */ public static void main(String[] args) throws Exception { //getClaz(); //getCalz2(); getClaz3(); } //Class가 제공하는 forName() 메서드를 사용합니다 public static void getClaz3() throws Exception { Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person"); System.out.println(claz==claz2); } //각 데이터 타입에는 하나의 정적 class 속성이 있습니다 public static void getCalz2() { Class<Person> p1 = Person.class; Class<Person> p2 = Person.class; System.out.println(p1==p2); } //Object 클래스가 제공하는 Class getClass() 메서드를 사용합니다 public static void getClaz() { Person person1 = new Person(); Class<? extends Person> claz = person1.getClass();//Person.class Person person2 = new Person(); Class<? extends Person> claz2 = person2.getClass();//Person.class System.out.println(claz==claz2); } }
동적이게 클래스를 가져와서 객체를 생성합니다
package com.sunwenou.reflect; public class Demo2 { public static void main(String[] args) throws Exception { //createObj(); createObj2(); } public static void createObj2() throws Exception { //Person person = new Person("lisi",23); //바이트코드 파일 객체를 얻습니다. Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class //파라미터를 가진 생성자가 소속된 Constructor 타입의 객체를 가져옵니다 Constructor constructor = claz.getConstructor(String.class,int.class); //Constructor 클래스가 제공하는 객체 생성 메서드를 사용하여 객체를 생성합니다 Person person = (Person)constructor.newInstance("lisi",23); System.out.println(person); } public static void createObj() throws Exception { //Person person = new Person(); //바이트코드 파일 객체를 얻습니다. Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Object obj = claz.newInstance();//기본적으로 비파라미터의 생성자를 사용하여 객체를 생성합니다 System.out.println(obj); } }
동적으로 클래스를 가져와 멤버 변수에 값을 할당합니다
package com.sunwenou.reflect; public class Demo3 { public static void main(String[] args) throws Exception { //Person p = new Person(); //p.name = "lisi"; //바이트코드 파일 객체를 얻습니다. Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //멤버 변수가 소속된 Field 타입의 객체를 가져옵니다 //Field field = claz.getField("name");//public 접근 권한의 멤버를 가져옵니다 Field field = claz.getDeclaredField("name");//모든 선언된 필드를 가져옵니다 System.out.println(field); //비스테이티컬 멤버 변수는 객체에 의존합니다 Object obj = claz.newInstance(); field.setAccessible(true);//강제로 접근 가능하게 설정합니다 field.set(obj, "张三"); System.out.println(obj); } }
동적으로 클래스를 가져와 메서드를 실행합니다
package com.sunwenou.reflect; public class Demo4 { public static void main(String[] args) throws Exception { //method1(); method2(); method3(); } public static void method3() throws Exception { //바이트코드 파일 객체를 얻습니다. Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("function", null); m.invoke(null, null); } ////수정된 매개변수를 가진 메서드를 실행합니다 public static void method2() throws Exception { //바이트코드 파일 객체를 얻습니다. Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); Method m = claz.getMethod("fun", String.class); Object obj = claz.newInstance(); m.invoke(obj, "hello"); } //불변수 메서드 실행 public static void method1() throws Exception { //Person person = new Person(); person.show(); //바이트코드 파일 객체를 얻습니다. Class<?> claz = Class.forName("com.sunwenou.reflect.Person"); //被执行 메서드의 바이트코드 파일 객체를 얻습니다. Method m = claz.getMethod("show", null); //비정적 메서드는 객체에 의존합니다. Object obj = claz.newInstance(); //메서드 실행 m.invoke(obj, null); } }
이것이 반영의 기본 사용법입니다. 정상적으로 객체를 생성할 수 없을 때, 객체의 바이트코드 파일을 통해 객체를 생성하고, 그 안의 메서드를 실행할 수 있습니다. 배웠나요?
자바와 관련된 더 많은 내용에 대해 관심이 있는 독자는 다음 웹사이트의 특辑을 확인하시기 바랍니다.:《자바 오브젝트 지향 프로그래밍 입문 및 고급 튜토리얼》、《자바 데이터 구조 및 알고리즘 튜토리얼》、《자바 DOM 노드 처리 기술 요약》、《자바 파일 및 디렉토리 처리 기술 요약》 및 《자바 캐시 처리 기술 요약》
본 문서에서 설명한 내용이 여러분의 자바 프로그램 설계에 도움이 되길 바랍니다.
고지사항: 본문은 인터넷에서 수집된 내용으로, 저작권자가 소유하고 있으며, 인터넷 사용자가 자발적으로 제공한 내용으로, 이 웹사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 침해가 의심되는 내용을 발견하시면, notice#w 이메일로 발송하여 주시기 바랍니다.3codebox.com에 (이메일 작성 시 #을 @으로 변경하시오) 신고를 하시고 관련 증거를 제공하시면, 사실 확인 후 즉시 저작권 침해 내용을 삭제하겠습니다.