除了之前使用的通过 new 的方式创建对象,我们还可以使用反射的方法在运行的时候来创建对象

    Person.java

    1. package test23;
    2. /**
    3. * Created By Intellij IDEA
    4. *
    5. * @author Xinrui Yu
    6. * @date 2021/12/6 15:23 星期一
    7. */
    8. public class Person {
    9. private String name;
    10. private int age;
    11. public Person() {
    12. }
    13. public Person(String name, int age) {
    14. this.name = name;
    15. this.age = age;
    16. }
    17. public String getName() {
    18. return name;
    19. }
    20. public void setName(String name) {
    21. this.name = name;
    22. }
    23. public int getAge() {
    24. return age;
    25. }
    26. public void setAge(int age) {
    27. this.age = age;
    28. }
    29. @Override
    30. public String toString() {
    31. return "Person{" +
    32. "name='" + name + '\'' +
    33. ", age=" + age +
    34. '}';
    35. }
    36. public void speak(){
    37. System.out.println("人可以说话");
    38. }
    39. private void show(){
    40. System.out.println("我是一个私有的show方法");
    41. }
    42. }
    1. package test23;
    2. import org.junit.Test;
    3. import java.lang.reflect.Constructor;
    4. import java.lang.reflect.Field;
    5. import java.lang.reflect.InvocationTargetException;
    6. import java.lang.reflect.Method;
    7. /**
    8. * Created By Intellij IDEA
    9. *
    10. * @author Xinrui Yu
    11. * @date 2021/12/6 15:23 星期一
    12. */
    13. public class ReflectionTest {
    14. @Test
    15. public void test1() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
    16. Class myClass = Person.class;
    17. Person person = null;
    18. // 1、获得构造器
    19. Constructor constructor = myClass.getConstructor(String.class,int.class);
    20. // 2、通过构造器构造对象
    21. Object o = constructor.newInstance("yxr", 19);
    22. // 3、判断一个是不是我们需要的 Person 类型
    23. if(o instanceof Person){
    24. System.out.println("创建的对象是 Person 类型");
    25. person = (Person) o;
    26. }else{
    27. System.out.println("创建的对象不是 Person 类型");
    28. }
    29. // 4、获得对象中的所有属性
    30. Field[] fields = myClass.getDeclaredFields();
    31. for (Field field : fields) {
    32. System.out.println("属性名:" + field.getName());
    33. }
    34. // 5、获得对象中的所有声明的方法
    35. Method[] methods = myClass.getDeclaredMethods();
    36. for (Method method : methods) {
    37. System.out.println("方法名:" + method.getName());
    38. }
    39. // 6、调用某一个具体的方法
    40. Method func = myClass.getMethod("speak");
    41. func.invoke(person);
    42. // 7、不同于普通的new Person(),通过反射来创建对象可以直接访问到对象中的的私有属性/方法
    43. // 这里尝试通过反射来调用 Person 中私有的show()方法
    44. Method method = myClass.getDeclaredMethod("show");
    45. // 需要把访问权限设置成 true
    46. method.setAccessible(true);
    47. method.invoke(person);
    48. }
    49. }

    image.png

    不同于普通的new Person()通过反射来创建对象可以直接访问到对象中的的私有属性

    method.setAccessible(true)

    image.png

    如果方法有返回值的话,也可以进行接收
    image.png