Java 反射和泛型

通过反射和泛型实例化对象,并给对象中的属性赋值

UserInfo.java

package bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserInfo {
    private String username;
    private Integer age;
    private String address;
}

GenericTemplateTest.java

实例化对象,并使用三种方式给对象中的属性赋值

import bean.UserInfo;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.HashMap;
import java.util.Map;

/**
 * 泛型模板测试
 */
public class GenericTemplateTest {
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, InvocationTargetException {
        Map<String, Object> valuesMap = new HashMap<>();
        valuesMap.put("id", 1L);
        valuesMap.put("username", "zhangsan");
        valuesMap.put("age", 17);
        valuesMap.put("address", "beijing");

        ReflectionClass<UserInfo> reflectionClass = new ReflectionClass<>();
        UserInfo userInfo = reflectionClass.instanceClass(UserInfo.class);

//        reflectionClass.setFields1(userInfo, UserInfo.class, valuesMap);
//        reflectionClass.setFields2(userInfo, UserInfo.class, valuesMap);
        reflectionClass.setFields3(userInfo, valuesMap);
        System.out.println(userInfo.toString());
    }
}



class ReflectionClass<T> {
    /**
     * 实例化对象
     * @param cls 待实例化对象的类
     */
    public T instanceClass(Class<T> cls) throws InstantiationException, IllegalAccessException {
        T t = cls.newInstance();
        for (Field declaredField : cls.getDeclaredFields()) {
            System.out.println(declaredField.getName());
        }

        System.out.println("--- 方法 ---");
        Method[] methods = cls.getMethods();
        for(Method method:methods){
            System.out.println("方法:" + method.getName());
            Parameter[] parameters = method.getParameters();
            for (Parameter parameter : parameters) {
                System.out.println(parameter.getName() + " --- " + parameter.getType() + " --- " + parameter.getParameterizedType());
            }

            System.out.println("返回值类型:" + method.getReturnType());
        }

        return t;
    }

    /**
     * 给属性赋值,使用 Field.set() 方法给每个属性赋值
     */
    public void setFields1(T t, Class<T> cls, Map<String, Object> valuesMap) throws InvocationTargetException, IllegalAccessException {
        for (Field declaredField : cls.getDeclaredFields()) {
            declaredField.setAccessible(true);
            declaredField.set(t, valuesMap.get(declaredField.getName()));
        }
    }

    /**
     * 给属性赋值,使用 BeanUtils.setProperty() 方法给每个属性赋值
     */
    public void setFields2(T t, Class<T> cls, Map<String, Object> valuesMap) throws InvocationTargetException, IllegalAccessException {
        for (Field declaredField : cls.getDeclaredFields()) {
            BeanUtils.setProperty(t, declaredField.getName(), valuesMap.get(declaredField.getName()));
        }
    }

    /**
     * 给属性赋值,使用 BeanUtils.populate() 给与 map 中对应的属性名称赋值
     */
    public void setFields3(T t, Map<String, Object> valuesMap) throws InvocationTargetException, IllegalAccessException {
        BeanUtils.populate(t, valuesMap);
    }
}

执行后,在 console 输出:

username
age
address
--- 方法 ---
方法:equals
arg0 --- class java.lang.Object --- class java.lang.Object
返回值类型:boolean
方法:toString
返回值类型:class java.lang.String
方法:hashCode
返回值类型:int
方法:getAddress
返回值类型:class java.lang.String
方法:setAddress
arg0 --- class java.lang.String --- class java.lang.String
返回值类型:void
方法:getAge
返回值类型:class java.lang.Integer
方法:setAge
arg0 --- class java.lang.Integer --- class java.lang.Integer
返回值类型:void
方法:getUsername
返回值类型:class java.lang.String
方法:setUsername
arg0 --- class java.lang.String --- class java.lang.String
返回值类型:void
方法:wait
返回值类型:void
方法:wait
arg0 --- long --- long
arg1 --- int --- int
返回值类型:void
方法:wait
arg0 --- long --- long
返回值类型:void
方法:getClass
返回值类型:class java.lang.Class
方法:notify
返回值类型:void
方法:notifyAll
返回值类型:void
UserInfo(username=zhangsan, age=17, address=beijing)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值