反射_Field
来源:互联网 发布:深圳软件开发有限公司 编辑:程序博客网 时间:2024/06/16 12:08
/**
*Field:利用Class对象获取字段的信息
*/
//1.获取字段
//1.1获取Field的数组
public Field[] getDeclaredFields();
Field[] fields = clazz.getDeclaredFields(); //clazz为字段所在的类的Class对象
//1.2获取指定名字的Field
public Field getDeclaredField(String name) //name 为字段的名字
Field field = clazz.getDeclaredField(fieldName);
//2.获取指定对象的指定字段的值(Field的方法 obj:字段所在的对象)
public Object get(Object obj)
Object val = field.get(obj);
//3.设置指定对象的指定字段的值 (obj:字段所在的对象,value:要设置的值)
public void set(Object obj,Object value)
field.set(obj,value);
例:
package com.chj.field;
public class Person {
String name;
private Integer age;
}
@Test
public void testField() throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
//获取Class对象
String className="com.chj.field.Person";
Class clazz = Class.forName(className);
//获取字段
Field[] fields = clazz.getDeclaredFields();
for(Field f : fields){
System.out.println(f);
}
Field field = clazz.getDeclaredField("name");
System.out.println(field);
//设置值
Person person = new Person();
field.set(person,"ABC");
Object val = field.get(person);
System.out.println(val);
//若字段是私有的,需要调用setAccessible(true)方法
Field field2 = clazz.getDeclaredField("age");
//设置值
field2.setAccessible(true);
field2.set(person,12);
//取值
Object val2 = field2.get(person);
System.out.println(val2);
}
输出:
java.lang.String com.chj.field.Person.name
private java.lang.Integer com.chj.field.Person.age
java.lang.String com.chj.field.Person.name
ABC
12
//工具方法
/**
* 为字段赋值
* @param obj
* @param field
* @param val
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
private void setFieldValue(Object obj, Field field, Object val) throws IllegalArgumentException, IllegalAccessException {
field.setAccessible(true);
field.set(obj, val);
}
/**
* 从Class对象或其父类中获取字段
* @param clazz
* @param fieldName
* @return
*/
public Field getField(Class clazz, String fieldName) {
for(Class clazz2 = clazz;clazz2 != Object.class;clazz2 = clazz2.getSuperclass()){
try {
Field field = clazz2.getDeclaredField(fieldName);
return field;
} catch (Exception e) {}
}
return null;
}
/**
* 为指定对象取出指定字段
* @param obj
* @param field
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public Object getFieldValue(Object obj, Field field) throws IllegalArgumentException, IllegalAccessException{
field.setAccessible(true);
return field.get(obj);
}
//类Student
package com.chj.field;
public class Student extends Person {}
@Test
public void testClassField() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
String className = "com.chj.field.Student";
String fieldName = "age";//可能为私有,可能在其父类中。
Object val = 20;
//创建className对应类的对象,并为其fieldName赋值为val
Object obj = null;
Class clazz = Class.forName(className);
//从指定对象或其父类中获取指定字段
Field field = getField(clazz,fieldName);
//为指定对象的指定字段赋值
obj = clazz.newInstance();
setFieldValue(obj,field,val);
//为指定对象取出指定字段
System.out.println(getFieldValue(obj,field));
}
输出:20
*Field:利用Class对象获取字段的信息
*/
//1.获取字段
//1.1获取Field的数组
public Field[] getDeclaredFields();
Field[] fields = clazz.getDeclaredFields(); //clazz为字段所在的类的Class对象
//1.2获取指定名字的Field
public Field getDeclaredField(String name) //name 为字段的名字
Field field = clazz.getDeclaredField(fieldName);
//2.获取指定对象的指定字段的值(Field的方法 obj:字段所在的对象)
public Object get(Object obj)
Object val = field.get(obj);
//3.设置指定对象的指定字段的值 (obj:字段所在的对象,value:要设置的值)
public void set(Object obj,Object value)
field.set(obj,value);
例:
package com.chj.field;
public class Person {
String name;
private Integer age;
}
@Test
public void testField() throws ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
//获取Class对象
String className="com.chj.field.Person";
Class clazz = Class.forName(className);
//获取字段
Field[] fields = clazz.getDeclaredFields();
for(Field f : fields){
System.out.println(f);
}
Field field = clazz.getDeclaredField("name");
System.out.println(field);
//设置值
Person person = new Person();
field.set(person,"ABC");
Object val = field.get(person);
System.out.println(val);
//若字段是私有的,需要调用setAccessible(true)方法
Field field2 = clazz.getDeclaredField("age");
//设置值
field2.setAccessible(true);
field2.set(person,12);
//取值
Object val2 = field2.get(person);
System.out.println(val2);
}
输出:
java.lang.String com.chj.field.Person.name
private java.lang.Integer com.chj.field.Person.age
java.lang.String com.chj.field.Person.name
ABC
12
//工具方法
/**
* 为字段赋值
* @param obj
* @param field
* @param val
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
private void setFieldValue(Object obj, Field field, Object val) throws IllegalArgumentException, IllegalAccessException {
field.setAccessible(true);
field.set(obj, val);
}
/**
* 从Class对象或其父类中获取字段
* @param clazz
* @param fieldName
* @return
*/
public Field getField(Class clazz, String fieldName) {
for(Class clazz2 = clazz;clazz2 != Object.class;clazz2 = clazz2.getSuperclass()){
try {
Field field = clazz2.getDeclaredField(fieldName);
return field;
} catch (Exception e) {}
}
return null;
}
/**
* 为指定对象取出指定字段
* @param obj
* @param field
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public Object getFieldValue(Object obj, Field field) throws IllegalArgumentException, IllegalAccessException{
field.setAccessible(true);
return field.get(obj);
}
//类Student
package com.chj.field;
public class Student extends Person {}
@Test
public void testClassField() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
String className = "com.chj.field.Student";
String fieldName = "age";//可能为私有,可能在其父类中。
Object val = 20;
//创建className对应类的对象,并为其fieldName赋值为val
Object obj = null;
Class clazz = Class.forName(className);
//从指定对象或其父类中获取指定字段
Field field = getField(clazz,fieldName);
//为指定对象的指定字段赋值
obj = clazz.newInstance();
setFieldValue(obj,field,val);
//为指定对象取出指定字段
System.out.println(getFieldValue(obj,field));
}
输出:20
阅读全文
0 0
- 反射_Field
- _Connection、_Recordset、_Field参考
- (1)_Connection [方法] [属性] [事件] (2)_Recordset [方法] [属性] [杂项] [事件] (3)_Field [方法] [属性]
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- JVM启动参数详解(含调优)
- Linux系统关键文件备份脚本
- Ubuntu16.04搭建完全分布式hadoop-2.7.4
- C++ GUI Programming with Qt4 Second Edition 之 B.1 使用qmake
- 深度纸质学习与实验(三)-将TensorFlow加入kubernetes初试
- 反射_Field
- centos7 安装rlwrap
- c++ poco Event 源码剖析
- hystrix配置属性说明
- 高性能通用检索系统设计实现
- java代理的几种实现
- 非递归遍历二叉树
- 蓝桥杯试题:饮料换购
- Tickets HDU