1 获取运行时类的完整结构

image.png

2 动态创建对象

2.1 通过Class.newInstance()创建

  1. package com.lht.reflection;
  2. public class TestReflection {
  3. public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
  4. Class clazz = Class.forName("com.lht.reflection.User");
  5. User user = (User) clazz.newInstance();
  6. System.out.println(user);
  7. }
  8. }
  9. // 实体类
  10. class User {
  11. private String name;
  12. private int id;
  13. public User() {
  14. }
  15. public User(String name, int id) {
  16. this.name = name;
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public int getId() {
  26. return id;
  27. }
  28. public void setId(int id) {
  29. this.id = id;
  30. }
  31. @Override
  32. public String toString() {
  33. return "com.lht.reflection.User{" +
  34. "name='" + name + '\'' +
  35. ", id=" + id +
  36. '}';
  37. }
  38. }
  1. com.lht.reflection.User{name='null', id=0}

本质上Class.newInstance()调用的是User类的默认构造方法,如果将默认构造方法删除,则会报错。

2.2 通过获取类的构造器

  1. 通过Class.getDeclaredConstructor(argType1, argType2, ...)获取想要的构造器constructor
  2. 通过constructor.newInstance(arg1, arg2, ...)动态创建类实例 ```java package com.lht.reflection;

import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException;

public class TestReflection { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { Class clazz = Class.forName(“com.lht.reflection.User”); Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class); User user = (User) constructor.newInstance(“lirt”, 210224); System.out.println(user); } }

// 实体类,同上 class User { … } ```