在开发中使用反射的时候并不多,但是偶尔要用的时候还是要知道怎么使用,不熟悉的可以参考下,基本都是固定写法。
public class Student {
private String name = "hello";
private int age = 18;
private Student(){
System.out.println("======Student=======");
}
Student(String name){
System.out.println("======Student======="+name);
}
public void test(){
System.out.println("=============");
}
public void test(String name){
System.out.println("============="+name);
}
public static void main(String[] args) throws Exception {
//获取Class
Class clazz = Class.forName("day02.Student");
//获取构造方法
Student student = (Student) clazz.newInstance();
//获取带参数的构造方法
//Constructor<Student> constructor = clazz.getDeclaredConstructor(String.class);
//Student student = constructor.newInstance("中国");
Field[] declaredFields = clazz.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
Field declaredField = declaredFields[i];
declaredField.setAccessible(true);
String aString = declaredField.getName();
//打印所有字段名字
System.out.println(declaredFields[i]+" "+aString);
}
//获取字段
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
//动态修改字段值
nameField.set(student, "world");
//获取字段值
String nameValueString = (String) nameField.get(student);
Field ageField = clazz.getDeclaredField("age");
ageField.setAccessible(true);
int ageValue = (int) ageField.get(student);
System.out.println(nameValueString+" "+ageValue);
//调用不带参数的方法
Method method = clazz.getDeclaredMethod("test", null);
method.setAccessible(true);
method.invoke(student, null);
//调用带参数的方法
Method method1 = clazz.getDeclaredMethod("test", String.class);
method1.setAccessible(true);
method1.invoke(student, "你好");
}
}
======Student=======
//======Student=======中国
private java.lang.String day02.Student.name name
private int day02.Student.age age
world 18
=============
=============你好