本Demo用到的类:User实体类、Demo02测试类
User.java
package reflect;
/**
* 用户实体类
* @author xhe
*
*/
public class User {
private String name;
private int age;
public User() {}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
protected String getName() {
return name;
}
protected void setName(String name) {
this.name = name;
}
protected int getAge() {
return age;
}
protected void setAge(int age) {
this.age = age;
}
}
Demo02.java
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 通过反射API动态的操作:构造器、方法、属性
* @author xhe
*
*/
public class Demo02 {
public static void main(String[] args) throws Exception {
String path = "reflect.User"; //User类的全路径
@SuppressWarnings("unchecked") //压制警告信息
Class<User> clazz = (Class<User>)Class.forName(path);
//通过反射API调用构造方法,构造对象
User user = clazz.newInstance(); //其实是调用了User对象的无参构造方法
System.out.println(user);
//调用User对象的带参构造方法,需要传递参数类型的class
Constructor<User> constructor = clazz.getDeclaredConstructor(String.class,int.class);
User user2 = constructor.newInstance("xhe",18);
System.out.println(user2.getName());
//通过反射API调用普通方法
User user3 = clazz.newInstance();
Method method = clazz.getDeclaredMethod("setName", String.class);
method.invoke(user3, "xhe2");
System.out.println(user3.getName());
//通过反射API操作属性
User user5 = clazz.newInstance(); //实例化User类
Field field = clazz.getDeclaredField("name"); //获取User类的name属性
field.setAccessible(true); //这个属性不做安全检查了,可以直接访问
field.set(user5,"xhe5"); //通过反射直接写属性
System.out.println(user5.getName());
}
}