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