发布于2026-07-16 阅读(0)
扫一扫,手机访问
Ja va这门语言里有个挺特别的东西,叫做ja va.lang.Class。这东西是Ja va虚拟机内部用的,它把每一个类都当作一个对象来看待,然后塞进虚拟机里。这在C/C++里可没有,算是Ja va独有的一个设计。
说到类,我们通常说“类是对象的抽象”,但ja va.lang.Class这个类,它本身又是对“类”这个概念的抽象——你可以理解成“抽象的抽象”。简单来说,ja va.lang.Class的实例,其实就是你在Ja va代码里写的那些类(比如你自己定义的Foo类);而你用new创建出来的那些对象,则是这些类的实例。所以整个层次就是:Class的实例是类,类的实例是对象。
之所以要这么绕一圈,个人觉得还是因为Ja va的运行时依赖虚拟机(JVM),它需要在C/C++那套基础上再多封装一层,才能实现对类型信息的动态管理和反射等机制。
光说理论难免抽象,下面直接看代码,一切都清楚了。
package my;
class Foo{
public void print() {
System.out.println("Foo print");
}
}
public class ClassDemo {
public static void main(String[] args) {
Foo foo1 = new Foo();
//方法一
@SuppressWarnings("rawtypes")
Class c1 = Foo.class;
//方法二
@SuppressWarnings("rawtypes")
Class c2 = foo1.getClass();
//方法三
@SuppressWarnings("rawtypes")
Class c3 = null;
try {
c3 = Class.forName("my.Foo");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
//创建对象
try {
Foo foo = (Foo)c1.newInstance();
}
catch (InstantiationException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(c2 == c3);
}
}

这段代码演示了获取Class对象的三种方式:
class,直接通过类名.class就能拿到。getClass()方法就可以得到它的Class实例。Class.forName("完整包名.类名")动态加载并获取。注意这里需要处理ClassNotFoundException异常。拿到了Class对象之后,还可以用它来创建该类的实例,也就是代码中的c1.newInstance()。这里有个关键限制:这个类必须有一个无参的构造函数,否则会抛出InstantiationException。另外调用时返回的是Object类型,你需要手动做类型转换。
最后那个System.out.println(c2 == c3),输出的是true,因为同一个类(Foo)在JVM中对应的Class对象是唯一的,不管你用哪种方式获取,都是同一个实例。这就是Ja va反射的基础,也是理解动态加载、框架底层原理的重要一步。
上一篇:java 版本含义
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8