取得成员
成员在类中也被称为属性,而在Class类里面针对于成员的取得也提供有如下的操作方法。
取得全部成员:
|-获得本类声明的成员:
public Field[] getDeclaredFields() throws SecurityException
|-获得继承的声明成员:
public Field[] getFields() throws SecurityException
取得指定名称的成员:
|-获得本类指定的成员:
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException
|-获得继承的声明成员:
在取得继承成员时,只能够取得所有的非私有化成员,
public Field getField(String name) throws NoSuchFieldException, SecurityException
java.lang.reflect.Field是表示成员的类型,而在这个类里面定义有如下几个方法
取得属性内容:
public Object get(Object obj) throws IllegalArgumentException, IllegalAccessException
取得属性类型:
public Class<?> getType()
设置属性内容:
public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException
范例:取得全部的成员信息
import java.util.Date; interface DD{ public static final String aa="sssssssssss"; } class Message{ private String zhiye; private Date shijian; } public class Dome6_1 extends Message implements DD{ private String name; private Integer age; }
此时的程序没有提供setter方法,只有封装属性.
import java.lang.reflect.Field; public class Demo6 { public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException { Class<?> cls=Class.forName("cn.zwb.dome1.Dome6_1"); { //取得全部成员 Field fields[] =cls.getFields(); for (int i = 0; i < fields.length; i++) { System.out.println(fields[i]); } } System.out.println("========================="); { //取得本类成员 Field fields[] =cls.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { System.out.println(fields[i]); } } } }
在实际开发之中,以上的操作时没有任何意义的,只有在IDE工具上会使用,但是Field类可以做
以下两件事情:
可以取得指定成员的类型
可以直接操作属性,可以完全避免掉Method操作;
但是需要注意的是,这种直接操作属性的情况是不允许出出现的,而且所有的属性时使用了private封装的,但是这种封装是可以解除的(Field,Method.Constructor的父类):
public void setAccessible(boolean flag) throws SecurityException
设置为true表示取消封装,默认为false.
范例:设置和取得属性
import java.lang.reflect.Field; public class Demo6 { public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, InstantiationException { Class<?> cls=Class.forName("cn.zwb.dome1.Dome6_1"); Object obj=cls.newInstance();//属性必须有对象产生才可以操作。 Field nameField=cls.getDeclaredField("name"); nameField.setAccessible(true);//取消封装 System.out.println("类型:"+nameField.getType().getSimpleName()); nameField.set(obj,"詹闻博"); System.out.println(nameField.get(obj)); } }
但是这样的做法是不标准的,因为所有设置属性和取得属性还是应该编写setter和getter方法,也就是所在整个开发过程之中,Field类给予我们最大支持是取得属性类型.
范例:解决属性设置问题
import java.util.Date; public class Dome6_1{ private String name; private Integer age; private Date credate; private Double costs; }//生成setter个getter方法
现在还是给出你字符串.
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; import cn.zwb.util.StringUtils; public class Demo6 { public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, InstantiationException, NoSuchMethodException, InvocationTargetException, ParseException { String str="name:詹闻博|age:21|credate:1997-06-06|costs:80000.0"; Class<?> cls=Class.forName("cn.zwb.dome1.Dome6_1"); Object obj=cls.newInstance(); String[] re=str.split("\\|"); for (int i = 0; i < re.length; i++) { String temp[] =re[i].split(":"); Field field=cls.getDeclaredField(temp[0]); Method setMet=cls.getDeclaredMethod("set"+StringUtils.initcap(temp[0]),field.getType()); if("string".equalsIgnoreCase(field.getType().getSimpleName())){ setMet.invoke(obj, temp[1]); }else if("int".equalsIgnoreCase(field.getType().getSimpleName())||"integer".equalsIgnoreCase(field.getType().getSimpleName())){ if(temp[1].matches("\\d+")){ setMet.invoke(obj, Integer.parseInt(temp[1])); } }else if("double".equalsIgnoreCase(field.getType().getSimpleName())){ if(temp[1].matches("\\d+(\\.\\d{1,2})?")){ setMet.invoke(obj, Double.parseDouble(temp[1])); } }else if("date".equalsIgnoreCase(field.getType().getSimpleName())){ if(temp[1].matches("\\d{4}-\\d{2}-\\d{2}")){ setMet.invoke(obj, new SimpleDateFormat("yyyy-MM-dd").parse(temp[1])); } } } System.out.println(obj); } }