java 利用反射修改对象中的list类型字段中的值。

这两天没事学习下了反射。通过反射我们可以修改对象中的字段的值。
就如下面这段代码

    Grade grade=new Grade();
    Field f=Grade.class.getDeclaredField("name");
    f.setAccessible(true);
    f.set(grade, "三年级一班");

这是so easy的,这时我想到了要是list类型的字段该怎么通过反射修改呢。
于是我就尝试了下,最终做了出来。

先准备两个类。

public class Grade {
    private String name;
    private List<Student> students;

    public Grade(){}
    public Grade(String name,List<Student> students){
        this.name=name;
        this.students=students;
    }
    public String toString(){
        StringBuilder sb=new StringBuilder();
        for(Student s : students){
            sb.append(s.getNumberid()+"    ");
        }
        return sb.toString();
    }
}
public class Student {
    private String name;
    private int age;
    private String numberid;
    public String getNumberid(){
        return numberid;
    }
}

下面实现的代码

public class Program {
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InstantiationException{
        Grade grade=new Grade();

        Field f=Grade.class.getDeclaredField("name");
        f.setAccessible(true);
        f.set(grade, "三年级一班");

        Field field=Grade.class.getDeclaredField("students");
        if(List.class.isAssignableFrom(field.getType())){
            List arraylist=new ArrayList();

            Type type=field.getGenericType();
            //这样判断type 是不是参数化类型。 如Collection<String>就是一个参数化类型。
            if(type instanceof ParameterizedType){
                //获取类型的类型参数类型。  你可以去查看jdk帮助文档对ParameterizedType的解释。
                Class clazz=(Class)((ParameterizedType) type).getActualTypeArguments()[0];
                Object obj=clazz.newInstance();
                Field ff=clazz.getDeclaredField("numberid");
                ff.setAccessible(true);
                ff.set(obj, "1001010");
                arraylist.add(obj);
            }
            field.setAccessible(true);
            field.set(grade, arraylist);
        }
        System.out.println(grade);
    }
}

这是一个简单的demo,与大家分享下。

时间: 2024-11-23 00:12:05

java 利用反射修改对象中的list类型字段中的值。的相关文章

泛型约束和利用反射修改对象属性的值

周日了都,昨天休息了一天,今天想想得敲敲代码练习一下,如下关于泛型约束和利用反射修改对象属性的值的, 都挺简单的,呵呵,但时间一长,不经常使用还容易忘记在此就当记录一下了, 首先泛型代码一般是如下的情形: 加了泛型约束,只允许引用类型并且是只能是无参数的构造函数的类型才能传入,也就是不允许给类构造参数传递实参,否则将报错. 错误 1 “XXXXXX.pros”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法“ 1 public static T GetObject<T>(T

Java利用反射访问对象的私有成员

当我们使用反射为java对象的全部字段逐一赋值的时候,私有字段是不允许直接访问的. 在java.lang.reflect当中,有几个比较实用的API可以解决: getDeclaredFields() :获得所有访问级别的字段 setAccessible(boolean flag): 修改类成员的可访问性 下面以一个JavaBean 对象 转 DBObject 对象的方法为例: public static DBObject bean2DbObject(DBObject dbObject, PicI

Java反射(三)在运行时利用反射分析对象

在运行时利用反射分析对象,其实就是利用反射来获得或者设置类的域.举例如下: 有一个Student类: package testreflection; public class Student { private String stuNum; public Student(String stuNum) { // TODO Auto-generated constructor stub this.stuNum = stuNum; } } 利用反射来获得和设置Student类的stuNum域的测试代码

java利用反射机制判断对象的属性是否为空

java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String>(); validateMap.put("serial", "编号");validateMap.put("major", "专业"); public static <T> String validateFiledIs

java 使用反射转换对象 Object to Map

Object to Map 转换的三种方法 就是把对象以及其对应的属性名 和属性值, 映射到一个Map中 import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.

C#利用反射来判断对象是否包含某个属性的实现方法

本文实例展示了C#利用反射来判断对象是否包含某个属性的实现方法,对于C#程序设计人员来说有一定的学习借鉴价值. 具体实现代码如下: 1 /// <summary> 2 /// 利用反射来判断对象是否包含某个属性 3 /// </summary> 4 /// <param name="instance">object</param> 5 /// <param name="propertyName">需要判断的

C#利用反射获取对象属性值

public static string GetObjectPropertyValue<T>(T t, string propertyname){     Type type = typeof(T); PropertyInfo property = type.GetProperty(propertyname); if (property == null) return string.Empty; object o = property.GetValue(t, null); if (o == n

[C#]利用反射来判断对象是否包含某个属性

关键代码: /// <summary> /// 利用反射来判断对象是否包含某个属性 /// </summary> /// <param name="instance">object</param> /// <param name="propertyName">需要判断的属性</param> /// <returns>是否包含</returns> public static

C# 中的枚举类型 enum (属于值类型)

原文 C# 中的枚举类型 enum (属于值类型) C# 支持两种特殊的值类型:枚举和结构. 声明枚举:声明时要声明所有可能的值. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace enumType { enum Season // enum 类型定义在 class 外面 { Spring, Summer, Fall, Winter // 最后一个元素后面