一 定义
java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意调动一个对象,都能够调用它的任意方法和属性,既然能够拿到那么,我们就有可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为Java的反射。
二 反射相关的类
类名 | 用途 |
Class类 | 代表类的实体,在运行的java应用程序中表示类的接口 |
Field类 | 代表类的成员属性/类的属性 |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
1 Class类(反射机制的起源)
java文件被编译后,生成了.class文件,JVM此时就要去解读文件,被编译后的Java文件.class也被JVM解析为一个对象,这个对象就是java.lang.Class这样当程序运行时,每个java文件就最终变成了Class类对象的一个实例,我们通过Java反射机制应用到这个实例,就可以去获得甚至添加改变这个类的属性和动作,使得这个类成为一个动态类。
方法 | 用途 |
getCLassLoader() | 获得类的加载器 |
getDeclaredClass() | 返回一个数组,数组中包含该类中所有类和接口类的对象(包括私有类) |
forName(String className) | 根据类名返回实例 |
newInstance() | 创建类的实例 |
getName() | 获得类的完整路径名字 |
方法 | 用途 |
getFIeld(String name) | 获得某个公有的属性对象 |
getField() | 获得所有的公有的属性对象 |
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredField() | 获得所有属性对象 |
方法 | 用途 |
getConstructor(Class...<?>paramenterTypers) | 获得给类中与参数匹配的公有构造方法 |
getConstructors() | 获得该类的所有公有构造方法 |
getDeclaredConstructor(Class...<?>paramenterTypers) | 获得该类中与参数类型匹配的构造方法 |
getDeclaredConstructors() | 获得该类的所有构造方法 |
代码演示:
Class:
public class Student extends Person{
public Student() {
}
public Student(String name, int age) {
super(name, age);
}
}
public class Person {
private String name;
public int age;
public Person(){
System.out.println("这是无参构造");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("这是有参构造");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
//第一种通过getClass获取Class对象
Student s1=new Student();
Class c1=s1.getClass();
//第二种直接 类名.class的方式获得
Class c2=Student.class;
//第三种通过Class对象的forName()静态方法获取,用的最多
Class c3=null;
try {
c3=Class.forName("Reflect.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
}
}
Constructor:
public class Test {
public static void main(String[] args) throws Exception{
//第一种通过getClass获取Class对象
Student s1=new Student();
Class c1=s1.getClass();
//getDeclaredConstructors()可以获得所有Public权限的构造方法
Constructor []constructors= c1.getDeclaredConstructors();
//拿到的无参构造
Constructor constructor=c1.getConstructor();
Constructor constructor1=c1.getDeclaredConstructor(String.class);
System.out.println(constructor);
System.out.println(constructor1);
}
}
Method:
Student s1=new Student();
Class c1=s1.getClass();
//获得该类对象的所有方法Method对象
// Method[]methods=c1.getMethods();
//获得某个方法
Method method=c1.getDeclaredMethod("eat", String.class);
method.setAccessible(true);
Student student=(Student) c1.newInstance();
method.invoke(student);
Method staticEar=c1.getDeclaredMethod("eat", String.class);
staticEar.invoke("wang");
}