1. 调用无参数构造器得到一个类的对象返回
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class对象
Class c = Person.class;
// 定位无参构造器对象
Constructor constructor = c.getDeclaredConstructor();
// 暴力打开私有构造器的访问权限(如果是私有构造器、private 就可以使用setAccessible暴力打开)
constructor.setAccessible(true);
// 通过无参数构造器初始化对象返回
Person person = (Person) constructor.newInstance();
System.out.println(person);
}
2. 调用有参数构造器得到一个类的对象返回
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class对象
Class c = Person.class;
// 定位有参构造器对象
Constructor constructor = c.getDeclaredConstructor(String.class, Integer.class, String.class);
// 暴力打开私有构造器的访问权限(如果是私有构造器、private 就可以使用setAccessible暴力打开)
// constructor.setAccessible(true);
// 通过无参数构造器初始化对象返回
Person person = (Person) constructor.newInstance("WFT", 18, "1.88");
System.out.println(person);
}
3. 获取全部的成员变量
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class对象
Class c = Person.class;
// 获取全部声明的成员变量对象
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName() + "-->>" + field.getType());
}
}
4. 获取某个成员变量 并为其赋值
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class对象
Class c = Person.class;
// 获取全部声明的成员变量对象
Field nameField = c.getDeclaredField("name");
System.out.println(nameField.getName() + "--->>" + nameField.getType());
Person person = new Person();
nameField.setAccessible(true); // 因为是私有属性 采用暴力反射!
/**
* 参数1:被赋值的对象
* 参数2:该成员变量的值
*/
nameField.set(person, "王大锤");
System.out.println(person);
/**
* 获取改成员变量的值
*/
String name = nameField.get(person) + "";
System.out.println(name);
}
5. 获取所有的methods方法
public static void main(String[] args) {
// 反射第一步先得到Class对象
Class c = Person.class;
// 获取所有的方法
Method[] methods = c.getDeclaredMethods();
// 遍历看一下
for (Method method : methods) {
// 方法名称 参数个数 返回值类型
System.out.println(method.getName() + "->" + method.getParameterCount() + "->" + method.getReturnType());
}
}
6. 获取某个methods方法并执行
public static void main(String[] args) throws Exception {
// 反射第一步先得到Class对象
Class c = Person.class;
// 获取setName方法
Method setName = c.getDeclaredMethod("setName", String.class);
// 调用方法
Person person = new Person();
Object o = setName.invoke(person, "WFT"); // 如果方法没有返回值 返回值为null
System.out.println(o);
System.out.println(person);
}