STACKJAVA

Code ví dụ Java Reflection, Clone Object, Copy Object

Code ví dụ Java Reflection, Clone Object, Copy Object.

(Xem lại: Java Reflection là gì? Hướng dẫn Java Reflection API)

Code ví dụ Java Reflection – Copy Object

Giả sử mình có một đối tượng và mình sẽ tạo một method để tạo ra một đối tượng khác giống hệt đối tượng đó.

Ví dụ mình có 2 Class sau:

package stackjava.com.reflection;

public class Customer {
  private int age;
  protected String gender;
  public String name;
  String phone;

  // setter - getter

  @Override
  public String toString() {
    return "Customer [age=" + age + ", gender=" + gender + ", name=" + name + ", phone=" + phone + "]";
  }

}
package stackjava.com.reflection;

public class Player {
  public String name;
  public String team;
  public String position;

  // getter - setter

  @Override
  public String toString() {
    return "Player [name=" + name + ", team=" + team + ", position=" + position + "]";
  }

}

Method thực hiện clone đối tượng:

  public static Object clone(Object object) {
    try {
      Class<?> myClass = object.getClass();
      Object newObject = myClass.newInstance();
//			Object newObject = myClass.getConstructor().newInstance();

      Field[] allFields = myClass.getDeclaredFields();
      for (Field field : allFields) {
        field.setAccessible(true);
        field.set(newObject, field.get(object));
      }
      return newObject;
    } catch (Exception e) {
      System.out.println(e);
      return null;
    }
  }

Đầu tiên mình sẽ lấy Class của đối tượng đầu vào bằng method getClass()

Tạo ra một đối tượng cùng kiểu với đối tượng đầu vào qua method newInstance() hoặc qua constructor getConstructor().newInstance() .

Duyệt các field của class, copy giá trị các field của đối tượng đầu vào sang đối tượng mới.

Để lấy các field mình dùng method getDeclaredFields() chứ không dùng getFields() vì ở đây mình copy cả các field private.

Gọi hàm setAccessible(true) để cho phép truy cập vào giá trị các field private.

method field.set(), field.get() cho phép truyền/lấy giá trị field của đối tượng.

Demo

package stackjava.com.reflection;

import java.lang.reflect.Field;

public class Demo {
  public static void main(String[] args) {
    Customer customer = new Customer();
    customer.setAge(25);
    customer.setGender("Male");
    customer.setName("kai");
    customer.setPhone("034xxxxxxx");
    
    Customer newCustomer = (Customer) clone(customer);
    System.out.println(newCustomer);
    
    Player player = new Player();
    player.setName("Neuer");
    player.setTeam("Bayer");
    player.setPosition("Goal Keeper");
    
    Player newPlayer = (Player) clone(player);
    System.out.println(newPlayer);
  }

  public static Object clone(Object object) {
    try {
      Class<?> myClass = object.getClass();
      Object newObject = myClass.newInstance();
//			Object newObject = myClass.getConstructor().newInstance();

      Field[] allFields = myClass.getDeclaredFields();
      for (Field field : allFields) {
        field.setAccessible(true);
        field.set(newObject, field.get(object));
      }
      return newObject;
    } catch (Exception e) {
      System.out.println(e);
      return null;
    }
  }
  
}

Kết quả:

Customer [age=25, gender=Male, name=kai, phone=034xxxxxxx]
Player [name=Neuer, team=Bayer, position=Goal Keeper]

 

Okay, Done!

Download code ví dụ trên tại đây.

 

 

References:

https://www.oracle.com/…/javareflection-1536171.html