Java 通过反射生成类的对象


#Java 反射、泛型与注解#


简介

两种方式:

  1. 使用 Class 的 newInstance 方法
  2. 使用 Constructor

示例

UserInfo 类

package org.example;

import java.io.Serializable;

public class UserInfo implements Serializable {

    public UserInfo() {}

    public UserInfo(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public String toString() {
        return "UserInfo{" +
                "name='" + name + '\'' +
                '}';
    }
}

生成对象

方式1:使用 Class 的 newInstance 方法

@Test
public void test_reflect() throws IllegalAccessException, InstantiationException {
    UserInfo userInfo = UserInfo.class.newInstance();
    userInfo.setName("x");
    System.out.println(userInfo);
}

执行结果:

UserInfo{name='x'}

方式2:使用 Constructor

package org.example;

import org.junit.jupiter.api.Test;

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

public class TestConstructor {

    // 使用无参构造函数
    @Test
    public void test_01() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Constructor<UserInfo> constructor = UserInfo.class.getDeclaredConstructor();
        UserInfo userInfo = constructor.newInstance();
        System.out.println(userInfo);
        // 以上代码输出: UserInfo{name='null'}
    }


    // 使用有参构造函数
    @Test
    public void test_02() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Constructor<UserInfo> constructor = UserInfo.class.getDeclaredConstructor(String.class);
        UserInfo userInfo = constructor.newInstance("李白");
        System.out.println(userInfo);
        // 以上代码输出: UserInfo{name='李白'}
    }
}


( 本文完 )