java的反射机制是Java的特性之一,是构建框架技术的基础所在
目录
反射的概念
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
总之
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
反射的使用(这里使用Student类做演示)
1、获取Class对象的三种方式
1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String className)(常用)
其中1.1是因为Object类中的getClass方法、因为所有类都继承Object类。从而调用Object类来获取
public class TestReflect {
public static void main(String[] args)throws Exception {
//1.获取类型Class
Class<Student> sc = Student.class;//1.1使用类型.class获取,因为Object类中的getClass方法、因为所有类都继承Object类。从而调用Object类来获取
Student s=new Student();//由于s的类型不能确定具体的对象地址(可能是子类类型)
Class<?extends Student> sc1=s.getClass();//1.2使用对象.getClass获取,任何数据类型(包括基本数据类型)都有一个“静态”的class属性
Class<?> sc2 = Class.forName("cn.kgc.Student");//1.3使用Class类的静态方法:forName(String className)(常用)
}
}
2、通过反射获取构造方法并使用:
Student类:
public class Student extends Human implements Talkable {
public int stuNo;
private double score;
public Student() {
}
public Student(int stuNo, double score) {
this.stuNo = stuNo;
this.score = score;
}
private Student(int stuNo, double score,String name) {
this.stuNo = stuNo;
this.score = score;
setName(name);
}
private int getStuNo() {
return stuNo;
}
private void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
2.1获取无参构造方法并创建对象
//2.1获取公有的,无参的构造方法并创建对象
Constructor<Student> c = sc.getConstructor(null);//因为是无参的构造方法所以类型是一个
//null,不写也可以:这里需要的是一个
//参数的类型,切记是类型
Student s = c.newInstance();//返回的是描述这个无参构造函数的类对象
System.out.println(s);
}
去掉student无参构造的public修饰符 改为私有
Constructor<Student> c = sc.getDeclaredConstructor();//2.2获取构造方法并调用,无论公共还是私有
c.setAccessible(true);//跟Student类不在同一个包,强行获取访问权限(忽略访问修饰符)
Student s = c.newInstance();//通过构造方法创建了一个Student类型的变量(对象)
System.out.println(s);
}
结果都为: