Java反射机制实战字段篇

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  我们下面通过反射机制,获取book对象中的length字段并进行修改,查看结果:

  Book book = new Book();

  Class aClass = book.getClass();

  Field field = aClass.getField(“length”);

  field.setInt(book, 9);

  System.out.println(book);

  可以看到运行结果是:

  Book:

  title=null

  length=9

  pages=null

  可以看出,length字段的值已经被修改了。

  上面修改的是int型的简单字段,事实上像title字段这样的对象字段也是可以修改的,下面是示例:

  Book book = new Book();

  Class aClass = book.getClass();

  Field[] fields = aClass.getFields();

  for (Field field : fields) {

  field.setAccessible(true);

  if(field.getType().equals(String.class)){

  field.set(book, “格林童话”);

  }else if(field.getType().equals(int.class)){

  field.set(book, 199);

  }

  }

  System.out.println(book);

  上面的代码输出结果是:

  Book:

  title=格林童话

  length=199

  pages=null

  事实上,是将所有String类型的字段都修改成“格林童话”,将所有int类型字段都修改成199 。我们甚至根本不知道这个字段代表什么意思。

  下面,我们对pages这个字段进行修改。这个字段是个ArrayList,我们将创建一个ArrayList对象,并向其中插入一个对象。

  Book book = new Book();

  Class aClass = book.getClass();

  Field[] fields = aClass.getFields();

  for (Field field : fields) {

  field.setAccessible(true);

  if(field.getType().equals(ArrayList.class)){

  String genric = field.getGenericType().toString();

  String genricClass = genric.substring(

  genric.indexOf(‘<‘) + 1,

  genric.indexOf(‘>’));

  Class entityClass = Class.forName(genricClass);

  Object obj = entityClass.newInstance();

  ArrayList list = new ArrayList();

  list.add(obj);

  field.set(book, list);

  }

  }

  System.out.println(book);

  输出结果如下:

  Book:

  title=null

  length=0

  pages=[page

  ]

  Page

  可以看出,尽管我们根本没有直接使用Page类,但还是创建出了一个Page对象。

  Page对象的创建语句在:entityClass.newInstance()这一句。newInstance语句是Class对象的重要方法,用来创建这个类对应的对象。当然,需要类的构造方法支持。另外,通过genGenericType方法,我们可以获取到字段的类型修饰符。放在这里,获取到的就是ArrayList。有了这一个字符串,我们就可以通过类加载器Class.forName来加载Page类并创建一个Page对象了。

[1][2]

每一天都不可追回,所以更要珍惜每一寸光阴,

Java反射机制实战字段篇

相关文章:

你感兴趣的文章:

标签云: