什么是反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。总之,反射就是把java类中的各种成分映射成一个个的Java对象。例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
常用的API
Class类:反射的核心类,反射所有的操作都是围绕该类来生成的,通过它,可以获取类的属性,方法等内容;
Field类:表示类的属性,可以获取和设置类中属性的值
Method类:表示类的方法,它可以用来获取类中方法的信息,或者执行方法
Constructor类:表示类的构造方法
放射的代码演示
public class Student {
private String name;
private int age;
private String sex;
public String address;
public Student() {
}
public Student(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
private Student(String name){
this.name=name;
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void show(){
System.out.println("当前对象当中的姓名"+getName());
}
private void method(){
System.out.println("method被调用了");
}
}
首先先创建一个学生类然后再对其中的各个属性进行私有化,最后利用反射的方式来调用其中的各个属性和方法。
首先需要建立一个学生类的对象
Student student = new Student();
第一种方式利用 类名+getClass()来获取
Class stu1 = student.getClass();//方式一:获取class对象
System.out.println(stu1.getName());//获取类名
第二种方式是利用 类名+Class来获取
// 方式二 类名.class
Class stu2 = Student.class;
System.out.println(stu2.getName());
第三种方式是利用 class.forName("全类名")
// 方式三 class.forName("全类名")
// Class stu3 = Class.forName("Student");
// System.out.println(stu3.getName());
获取公共属性和私有属性的代码演示
// 获取公共属性
// Field[] fields = stu2.getFields();
// for (Field field :fields){
// System.out.println(field.getName());
// }
//
获取私有属性
// Field[] declaredFields = stu2.getDeclaredFields();
// for(Field field :declaredFields){
// System.out.println(field.getName());
// }
一般情况下都是使用第二种方法因为使用类需要封装。
调用指定的方法代码
// 调用指定的方法
Method show = stu2.getDeclaredMethod("show");
System.out.println(show.getName());
show.invoke(stu2.newInstance());
// 私有方法被调用的时候需要使用暴力反射进行调用
Method method = stu2.getDeclaredMethod("method");
method.setAccessible(true);
method.invoke(stu2.newInstance());
}