您的位置:首页 > 编程语言 > Java开发

初识java反射机制

2016-03-31 14:31 405 查看
反射机制主要是通过Class这个对象,通过class对象我们能得到相应的实例化对象Class.forName(className),
通过Method获取class对象相应是方法,通过Field获取属性。如下代码:

public ReflexUtils(Object obj, String property, Object val) {
this.stringUtils = StringUtils.getInstance();//获取搜字母转化对象
this.obj = obj;//初始化传入对象
this.property = property;//对象属性
this.val = val;//对象数据的值
try {
handleString();//设置对象属性
setVal();//设置对象的值
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void handleString() throws Exception {
String[] propertys = property.split("\\.");//可能没多级属性
this.sourceObj = this.obj;
for (int i = 1; i < propertys.length; i++) {
if (i < propertys.length - 1) {
//通过反射获取方法
Method method = this.sourceObj.getClass().getMethod(
"get" + stringUtils.getChangeName(propertys[i]));
//通过反射获取属性
this.field = this.sourceObj.getClass().getDeclaredField(
propertys[i]);
//通过反射方法实例化反射对象
sourceObj = method.invoke(this.sourceObj);
} else {
this.field = this.sourceObj.getClass().getDeclaredField(
propertys[i]);
}
}
}

public void setVal() throws Exception {
String sname = this.field.getType().getSimpleName();//获取数据的名称
this.field.setAccessible(true);//将私有的数据变成可操作对象
if (sname.contains("[")) {
String[] val = (String[]) this.val;
if (sname.equalsIgnoreCase("String[]")) {
this.field.set(this.sourceObj, val);//通过反射设置属性的值
} else if (sname.equalsIgnoreCase("int[]")
|| sname.equalsIgnoreCase("Integer[]")) {
int[] date = new int[val.length];
for (int i = 0; i < val.length; i++) {
date[i] = Integer.parseInt(val[i]);
}
this.field.set(this.sourceObj, date);
} else if (sname.equalsIgnoreCase("double[]")
|| sname.equalsIgnoreCase("Double[]")) {
double[] date = new double[val.length];
for (int i = 0; i < val.length; i++) {
date[i] = Double.parseDouble(val[i]);
}
this.field.set(this.sourceObj, date);
}
} else {
String val = this.val.toString();
if (sname.equalsIgnoreCase("date")
&& val.matches("\\d{4}-\\d{2}-\\d{2}")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
this.field.set(this.sourceObj, sdf.parse(val));
} else if (sname.equalsIgnoreCase("int")
|| sname.equalsIgnoreCase("Integer")) {
if (val.matches("\\d+")) {
this.field.set(this.sourceObj, Integer.parseInt(val));
}
} else if (sname.equalsIgnoreCase("double")
|| sname.equalsIgnoreCase("Double")) {
if (val.matches("\\d+(\\.+\\d+)?")) {
this.field.set(this.sourceObj, Double.parseDouble(val));
}
} else {
this.field.set(this.sourceObj, this.val);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java反射-反射