java反射机制定义:
Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
在了解反射机制前,需要了解Class对象是什么。我们知道可以使用javac编译命令将一个java文件编译为.class文件即字节码文件。而在反射机制中,会主要使用到.class文件。首先了解获取Class类的方法。
package com.wen.javaTest;
public class Teacher {
String name;
int age;
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 Teacher(String name, int age) {
this.name = name;
this.age = age;
}
public Teacher() {
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
当前有一个Teacher类,就用该类讲解获取其对应的Class类的方法。
获取Class类的三种方法:
第一种:通过类的静态class属性获取
Class c = Teacher.class;
System.out.println(c);
输出结果:
第二种: 通过实例化对象的getClass()方法获取
Class c2 = new Teacher().getClass();
System.out.println(c2);
输出结果:
第三种: 通过Class类的静态方法forName(String className)获取
Class c3 = null;
try {
c3 = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c3);
输出结果:
获取class类后,就可以得到通过反射获取到class文件里的所有内容,包含构造方法、属性、普通方法等。
反射获取构造方法信息:(使用Constructor类)
Class c = null;
try {
c = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
// 得到指定的构造方法
Constructor constructor = c.getConstructor(String.class, int.class);
// 得到对象
Teacher teacher = (Teacher) constructor.newInstance("WEN",18);
System.out.println("姓名:"+teacher.getName() + "\n年龄:"+teacher.getAge());
} catch (Exception e) {
e.printStackTrace();
}
反射获取普通方法信息:(使用Method类)
Class c = null;
try {
c = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
// 得到对象
Teacher teacher = (Teacher)c.newInstance();
//获取指定参数的普通方法
Method method = c.getDeclaredMethod("setAge",int.class);
//使用invoke方法调用set方法进行赋值
method.invoke(teacher,18);
System.out.println(teacher.getAge());
} catch (Exception e) {
e.printStackTrace();
}
反射获取属性信息: (使用Field类)
Class c = null;
try {
c = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
// 得到对象
Teacher teacher = (Teacher)c.newInstance();
//获取指定参数的普通方法
Field field = c.getDeclaredField("age");
//设置方法允许操作私有属性
field.setAccessible(true);
field.set(teacher,18);
System.out.println(teacher.getAge());
} catch (Exception e) {
e.printStackTrace();
}
反射获取父类的Class类信息:
Class c = null;
try {
c = Class.forName("com.wen.javaTest.Teacher");//Teacher类所在的路径
Class superClass = c.getSuperclass();
System.out.println(superClass);
} catch (Exception e) {
e.printStackTrace();
}