Java 반사는 메서드 이름에 따라 다른 메서드를 동적으로 호출합니다(예시)

list 페이지의 필드는 사용자의 취향에 따라 정렬할 수 있도록 요구하기 때문에 모든 사용자의 필드는 서로 다른 순서(필드 순서 저장 데이터베이스)에 대응한다. 우리가 데이터베이스에서 추출한 값은 대상이지만 프론트 데스크톱 값은 aax와 json array를 사용하기 때문에 하나의 대상에서 json으로 전환하는 문제에 직면한다.각 사용자의 필드 순서가 고정되지 않아서 코드를 죽일 수 없습니다. 2.사용자 필드 순서에 따라 값을 찾습니다. 만약if로 모든 값을 판단하고 다른 방법을 사용한다면if조건문은 너무 많습니다.그리고 반사를 봤어요.
모델 클래스, 일반 모델과 동일

public class Person {

  private String name;
  private int age;
  private String address;
  private String phoneNumber;
  private String sex;


  public String getName() {
    return name;
  }
//  get  set , 。
}


테스트 클래스

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Test {

  // init person object.
  private Person initPerson() {
    Person p = new Person();

    p.setName("name");
    p.setAge(21);
    p.setAddress("this is my addrss");
    p.setPhoneNumber("12312312312");
    p.setSex("f");

    return p;
  }
  
  public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    Test test = new Test();
    Person p = test.initPerson();
    List<String> list = new ArrayList<String>();

    // Add all get method.

    // There is no ‘()' of methods name.

    list.add("getName");
    list.add("getAge");
    list.add("getAddress");
    list.add("getPhoneNumber");
    list.add("getSex");
    
    for (String str : list) {

  // Get method instance. first param is method name and second param is param type.

  // Because Java exits the same method of different params, only method name and param type can confirm a method.

      Method method = p.getClass().getMethod(str, new Class[0]);

  // First param of invoke method is the object who calls this method.

  // Second param is the param.

      System.out.println(str + "(): Get Value is  " + method.invoke(p, new Object[0]));
    }
  }
}


샘플은 데이터베이스에서 얻은 필드에 따라 대상에서 상응하는 값을 두루 찾을 수 있다
위의 그 방법은list에 get 방법명을 추가해야만 상응하는 get 방법명에 따라 값을 얻을 수 있습니다. 만약에 프론트에서 전송된 것이 단지 하나의 속성명이라면 우리는 상응하는 get 방법으로 전환해야 합니다. 번거롭습니다.

public static void getValueByProperty(Person p, String propertyName) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    // get property by the argument propertyName.
    PropertyDescriptor pd = new PropertyDescriptor(propertyName, p.getClass());
    Method method = pd.getReadMethod();
    Object o = method.invoke(p);
    System.out.println("propertyName: " + propertyName + "\t  value is:  " + o);
  }
  
  public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, IntrospectionException {
    Test test = new Test();
    Person p = test.initPerson();
    

// get all properties.
    Field[] fields = p.getClass().getDeclaredFields();
    for (Field field : fields) {
      getValueByProperty(p, field.getName());
    } 
  }


이렇게 하면 전송된propertyName을 통해 대응하는value 값을 얻을 수 있습니다.
이상의 이 자바 반사는 서로 다른 방법명에 따라 동적으로 서로 다른 방법(실례)을 호출하는 것이 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분에게 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기