English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 프로그래밍에서 반영 메커니즘 사용 방법 및 예제 요약

이 문서는 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에 (이메일 작성 시 #을 @으로 변경하시오) 신고를 하시고 관련 증거를 제공하시면, 사실 확인 후 즉시 저작권 침해 내용을 삭제하겠습니다.

추천해 드립니다