使用反射设置好了私有属性,在不使用setAccessible(true)时候,为什么不能使用demo.getName()方法获取属性?
public class Test{
public static void main(String [] args)
{
Class clazz = Class.forName("com.test.Demo");
Demo demo = (Demo)clazz.newInstance();
//f.setAccessible(true);
Field f = clazz.getDeclaredField("name");
f.set(demo,"zhangsan");
System.out.println(test1.getName()); //
}
}
Demo类(com.test包)如下
Demo.java
public class Demo {
private String name;
private int id;
private double salary;
public Demo(String name, int id, double salary) {
super();
this.name = name;
this.id = id;
this.salary = salary;
}
public Demo(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
你的使用不正确,给个范例
String type = field[j].getGenericType().toString(); // 获取属性的类型
if (type.equals("class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名
Method m = model.getClass().getMethod("get" + name);
String value = (String) m.invoke(model); // 调用getter方法获取属性值
if (value == null) {
m = model.getClass().getMethod("set"+name,String.class);
m.invoke(model, "");
}
}
if (type.equals("class java.lang.Integer")) {
Method m = model.getClass().getMethod("get" + name);
Integer value = (Integer) m.invoke(model);
if (value == null) {
m = model.getClass().getMethod("set"+name,Integer.class);
m.invoke(model, 0);
}
}
if (type.equals("class java.lang.Boolean")) {
Method m = model.getClass().getMethod("get" + name);
Boolean value = (Boolean) m.invoke(model);
if (value == null) {
m = model.getClass().getMethod("set"+name,Boolean.class);
m.invoke(model, false);
}
}
if (type.equals("class java.util.Date")) {
Method m = model.getClass().getMethod("get" + name);
Date value = (Date) m.invoke(model);
if (value == null) {
m = model.getClass().getMethod("set"+name,Date.class);
m.invoke(model, new Date());
}
}
类如果有get方法,就可以用get方法获取属性内容,但是如果类没有get方法呢?如果没有get方法,同时还需要获取属性内容,则需要使用反射