功能描述: 1. 获取一个类中的所有域。 2. 根据获取的域信息,为域赋值。问题描述: 由于域信息可能为一个自定义类对象,因此在这里我们无法得知此类的构造函数信息。
请问,在这种情况下,有没有方法来初始化域对象?
请问,在这种情况下,有没有方法来初始化域对象?
解决方案 »
- 这道java基础题,哪位高手能够指点下,谢谢
- JAVA中焦点在JTextField中按下键盘TAB键却监听不到
- 堆是栈的一个组成元素 什么意思?堆跟栈的关系到底是啥?
- 问个关于String类数组内存分配的问题
- 继续帮助
- 在字符串中找出连续最长的数字串,必须是连续的
- JAVA初学者的问题----在线等待!!!
- Redhat 7.3下面安装jbuilder7的问题??
- 帮忙看一下小代码
- 请问JAVA可用来做什么?是不是只能作网站?
- 如何以追加的、字符流的方式去写文件,然后能像C语言那样控制写入的格式,如%-12s,如果字符串长度小于12,自动补空格到12字符,从而实现每条记录全都对齐
- CRC-CCITT 算法问题
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
这个方法可以返回该类的所有非私有的域名。得到后给域赋值请参考java.lang.reflect.Method类
invoke(Object obj, Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。将你要赋的值invoke进去即可
for example
public Object newInstance(Class c) {
if (c==boolean.class || c==Boolean.class) { //基本类型,直接返回
return new Boolean(false);
} else if (c==byte.class || c==Byte.class) { //其他的LZ自己补充
return new Byte(0);
} else if (c==short.class || c==Short.class) { } else if (c==char.class || c==Character.class) { } else if (c==int.class || c==Integer.class) { } else if (c==long.class || c==Long.class) { } else if (c==float.class || c==Float.class) { } else if (c==double.class || c==Double.class) { } else if (c==String.class) { } else if (c.isArray()) { //数组 } Object o = null;
Constructor con = c.getConstructors()[0]; //因为不知道构造方法信息,取第一个构造方法
con.setAccessible(true);
Class[] pc = con.getParameterTypes(); //获取构造方法参数
Object[] vals = new Object[pc.length];
for (int i=0; i<pc.length; i++) {
vals[i] = newInstance(pc[i]); //递归获取参数的实例
}
o = con.newInstance(vals); //生成实例 //可以继续设置属性
for (Field f : c.getDeclaredFields()) {
Class fc = f.getType();
f.setAccessible(true);
if (f.get(o) == null) {
Object fo = newInstance(fc); //递归获得属性实例
f.set(fo);
}
} return o;
}