获得类和实例
我们以汽车类型为例:
public class Car {
private String name = "111";
public double salary = 12.0;
public String getName() {
return name;
}
private void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Car [name=" + name + ", salary=" + salary + "]";
}
}
然后利用反射获得类和他的实例:
public static void main(String[] args) {
try {
Class car = Class.forName("Car");
Car car2 = (Car) car.newInstance();
System.out.println(car);
System.out.println(car2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出为:
class Car
Car [name=111, salary=12.0]
然后获得遍历获得他的所有域和值:
public static void main(String[] args) {
try {
Class car = Class.forName("Car");
Field[] f = car.getDeclaredFields();
for(Field fie : f) {
fie.setAccessible(true);
System.out.println(fie.toString()+" : "+fie.get(car.newInstance()));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出为:
private java.lang.String Car.name : 111
public double Car.salary : 12.0
接下来我们尝试执行他的私有和公有方法:
public static void main(String[] args) {
try {
Class car = Class.forName("Car");
Car car2 = (Car) car.newInstance();
Method method = car.getDeclaredMethod("setName",String.class);
method.setAccessible(true);
//name值改变成5555
method.invoke(car2,"5555");
Method method2 = car.getDeclaredMethod("getName");
System.out.println(method2.invoke(car2));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出为:
5555