Java反射机制的运用
一个关于“反射”的练习
举例一个学生类
点击查看【Student.java】代码
package com.unit13.pojo;
public class Student {
private int id;
private String name;
private int age;
public static String info = "能访问的公有属性";
public void study() {
System.out.println(this.name+"在认真学习!");
}
public void show() {
System.out.println(this.name+"今年"+this.age+"岁了!");
}
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
围绕该学生类逐步掌握“反射”的知识点
点击查看【Test.java】代码
package com.unit13.test;// 包名
import com.unit13.pojo.Student;// 学生类
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
/**
* @Title: Java反射机制的运用,掌握:1、Constructor;2、Method;3、Field;
* @Description: 融会贯通-练习:
* 1、获取类的信息;
* 2、用反射机制获取类的指定构造方法并调用该构造方法;
* 3、用反射机制获取指定方法并调用该方法;
* 4、用反射机制获取指定属性。
* @author: TabKey9
* @CreateDate: 2022.3.9 9:30
*/
public class Test {
public static void main(String[] args) throws Exception {
// 获取类的信息
Class obj = Class.forName("com.unit13.pojo.Student");// 根据类名获得类信息
// System.out.println(obj);// 输出:class com.unit13.pojo.Student
// 先看看类中有哪些构造方法,获取类的所有构造方法
Constructor[] cons = obj.getConstructors();
for (Constructor i : cons) {
// System.out.println(i);// 输出:public com.unit13.pojo.Student(int,java.lang.String,int)
}
// 用反射机制调用构造方法
// 1、获取指定构造方法
Constructor con = obj.getDeclaredConstructor(int.class,String.class,int.class);
// 2、调用构造方法
Student t =(Student) con.newInstance(99,"李四",82);// 用 newInstance() 调用
// System.out.println(t.getName());// 输出:李四
// 先看看类中有哪些用public修饰的方法、以及继承自父类的方法
// Method[] ms = obj.getMethods();
// 另一种,获得类中所有方法,包括私有的,但不包括父类的方法
Method[] ms = obj.getDeclaredMethods();
for (Method i : ms) {
// System.out.println(i);
}
// 获取类中指定的方法
Method m1 = obj.getDeclaredMethod("show");
// System.out.println(m1);// 输出:public void com.unit13.pojo.Student.show()
// 上面 m1 获得了指定的方法,再用 invoke(); 该方法
// m1.invoke(t);// 相当于执行了 show(); 输出:李四今年82岁了!
// 老规矩,不知道有什么属性,先看看类中有什么属性,再做打算
// Field[] fs = obj.getFields();// 全是私有的属性,这个 getFields();获取不到
Field[] fs2 = obj.getDeclaredFields();// 得到类中所有的属性,包括私有的
for (Field i : fs2) {
// System.out.println(i);// 输出:(私有的:id、name、age)
}
// 访问私有属性. 提前说结论:访问私有属性,只能拿到它的信息,拿不到它的值,如果想拿到它的值,得改成公有的属性。
Field f1 = obj.getDeclaredField("name");// 可以得到私有属性的信息,但不能访问它的值
// System.out.println(f1);// private java.lang.String com.unit13.pojo.Student.name
// String s1 = (String) f1.get(String.class);
// System.out.println(s1);// 报错信息: .Test can not access a member of class com.unit13.pojo.Student with modifiers "private"
// 翻译:Test类 不能访问 Student类 的私有成员变量
Field f2 = obj.getDeclaredField("info");// 刻意在 Student类中定义了一个公有的属性(info)用来验证公有的属性能被访问
String s2 = (String) f2.get(String.class);// get()得到的是 Object ,用了强制转换类型 String
// System.out.println(s2);// 输出:能访问的公有属性
}
}
运行
全部输出的话有点乱,全部输出都注释掉了,想看哪个自己开哪个!