浅谈Java反射机制 之 获取类的字节码文件

时间:2021-09-09 17:07:23

先贴上Java反射机制的概念:

AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

 

这么一讲很强大有没有!

反射的机制的实现还有仰仗Class类,因为想要剖析一个类就必须先要获取到该类的字节码文件对象,而Class类用于表示.class文件(字节码)

而且从获取到剖析使用的都是Class类的方法。

获取类字节码方法有三种:

1、通过实例化对象的 stu.getClass() 获取到字节码文件

getClass()方法其实是Object的一个方法,Class继承了Object,所以我们可以直接使用。

public class Test01 {
    
    public static void main(String[] args) {
        Student stu=new Student();
        Class c=stu.getClass();
        System.out.println(c.getName());
    }
}

结果:com.reflection.model.Student

当然这种方法没什么意义,因为我们都 new 实例化对象了,就没有必要反射了。

2、通过类的 .class 属性获取类的字节码文件

import com.reflection.model.Student;
public class Test02 {
    public static void main(String[] args) {
        Class c= Student.class;
        System.out.println(c.getName());
    }
}

结果:com.reflection.model.Student

这种方法比第一种方法稍好,当也有不足之处,因为需要导入类的包,这样做依赖性太强,不利于解耦。

3、通过类的全路径名获取Class对象 使用Class.forName("全路径名")来实现

此处可能会报出 ClassNotFoundException 异常因为 你给的全路径名可能不存在,因此给他加一个try{}cath(){}

public class Test03 {
    public static void main(String[] args) {
        try {
            Class c=Class.forName("com.reflection.model.Student");
            System.out.println(c.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

结果:com.reflection.model.Student

比较前两个方法我们可以看出第三种方法才是我们需要的。

虽然这里用是  全路径名 输出的结果也是 全路径名,但取到的是一个 类的字节码文件,可以用它做很多事。

下一篇将会讲到  使用 Class中的方法获取 类中的 方法和属性(包括构造方法)