Java中的反射机制
2021-04-17 本文已影响0人
w达不溜w
Java的反射机制是在运行状态中,对于任意一个类,都能获取这个类的所有属性和方法,对于任意一个对象,能够调用它的任意一个方法和属性,包括私有方法和属性,这种动态地获取信息以及动态的调用对象的方法的工程称之为Java的反射机制。
实例应用
//--Student测试类定义
public class Student {
//私有属性
private String name;
// 无参构造函数
public Student() {
System.out.println("调用了无参构造函数");
}
// 有参构造函数
public Student(String str) {
System.out.println("调用了有参构造函数");
}
// 无参数方法
public void setName1() {
System.out.println("调用了无参方法:setName1()");
}
// 有参数方法
public void setName2(String str) {
System.out.println("调用了有参方法setName2(String str):" + str);
}
}
实例1:利用反射获取类的属性&赋值
public static void main(String[] args) {
try {
// 1.获取Student类的Class对象
Class<Student> studentClass = Student.class;
// 2.通过Class对象创建Student类的对象
Student mStudent = studentClass.newInstance();
// 3.通过Class对象获取Student类的name属性
Field f = studentClass.getDeclaredField("name");
// 4.设置私有访问权限
f.setAccessible(true);
// 5.对新创建的Student对象设置name值
f.set(mStudent,"bestchangge");
// 6.获取新创建Student对象的name属性
System.out.println(f.get(mStudent));
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果:
调用了无参构造函数
bestchangge
实例2:利用反射调用类的构造函数
public static void main(String[] args) {
try {
// 1 获取Student类的Class对象
Class<Student> studentClass = Student.class;
// 2.1 通过Class对象获取Constructor类对象,从而调用无参构造(构造函数的调用实际上是在newInstance())
Student student1 = studentClass.getConstructor().newInstance();
// 2.2 通过Class对象获取Constructor类对象(传入参数类型),从而调用有参构造
Student student2 = studentClass.getConstructor(String.class).newInstance("bestchangge");
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果:
调用了无参构造函数
调用了有参构造函数,传值为:bestchangge
实例3:利用反射调用类对象的方法
public static void main(String[] args) {
try {
// 1 获取Student类的Class对象
Class<Student> studentClass = Student.class;
// 2 通过Class对象获取Constructor类对象,从而调用无参构造(构造函数的调用实际上是在newInstance())
Student mStudent = studentClass.getConstructor().newInstance();
// 3.1 通过Class对象获取方法setName1()的Method对象
Method method1 = studentClass.getMethod("setName1");
// 通过Method对象调用setName1()
method1.invoke(mStudent);
// 3.2 通过Class对象获取方法setName2()
Method method2 = studentClass.getMethod("setName2", String.class);
// 通过Method对象调用setName2()
method2.invoke(mStudent,"bestchangge");
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果:
调用了无参构造函数
调用了无参方法:setName1()
调用了有参方法setName2(String str):bestchangge