Java基础之反射学习
直接上代码,代码里有解释
- Student类,有私有和公有的属性和方法
public class Student {
private String name;
private int age;
public String pwd;
public Student(String name, int age, String pwd) {
this.name = name;
this.age = age;
this.pwd = pwd;
}
public void printLog(String msg){
System.out.println("打印日志"+msg);
}
private void method(String msg){
System.out.println("我是一个私有的方法:"+msg);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", pwd='" + pwd + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
- Test类,对属性值得修改和方法的调用进行测试,还有构造方法没有测试,不过也是一样的
public class TestReflect {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
Student student = new Student("小刘",22,"123456");
System.out.println(student);
//1. 对象.getClass()方法获取Class对象 类名.class 获取Class对象 打印出来是全类名,
System.out.println(student.getClass());
//2. 怎么获取一个类的方法名 和 属性fields
/*
* getDeclaredFields 获取私有和公有的各种属性
* private int com.kun.reflect.Student.age
* */
Field[] fields = student.getClass().getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
/**
* getDeclaredMethods 获取私有和公有的方法
* public void com.kun.reflect.Student.setName(java.lang.String)
* private void com.kun.reflect.Student.method()
* 可以知道可以知道方法名和参数
*/
Method[] methods = student.getClass().getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
//3. 可以给私有和公有属性赋值 1)先获取对象; 2)设置可以访问;3)使用set方法set(对象名,值)
Field name = student.getClass().getDeclaredField("name");
name.setAccessible(true);
name.set(student,"小谢");
System.out.println(student);
//4. 调用方法 1)获取方法; 2)设置可以访问;3)使用invoke方法 invoke(对象,参数值) 对象必须是该方法的对象,可以新创建出来的
Method method01 = student.getClass().getDeclaredMethod("method", String.class);
method01.setAccessible(true);
// student对象调用method01方法
method01.invoke(student,"调用方法一");
}
}