注意Class类的特殊性

简介:

Java语言是先把Java源文件编译成后缀为class的字节码文件,然后再通过ClassLoader机制把这些类文件加载到内存中,最后生成实例执行的,这是Java处理的基本机制,但加载到内存中的数据是如何描述一个类的呢?

比如在Dog.class文件中定义了的是一个Dog类,那它在内存中是如何展现的呢?

Java使用一个元类(MetaClass)来描述加载到内存中的类数据,这就是Class类,它是一个描述类的类对象,比如Dog.class文件加载到内存中后就是一个Class实例对象描述.

因为Class是一个类种类,也就预示着它有很多特殊的地方:

1.无构造函数.Java中的类一般都有构造函数,用于创建实例对象,但是Class类却没有构造函数,不能实例化,Class对象是在加载类时由Java虚拟机通过调用类加载器中的defineClass方法自动构造的.

2.可以描述基本类型.虽然8个基本类型在JVM中并不是一个对象,它们一般存在于栈内存中,但是Class类仍然可以描述它们,例如可以使用int.class标识int类型的类对象.

3.其对象都是单例模式.一个Class的实例对象描述一个类,并且只描述一个类,反过来也成立,一个类只有一个Class实例对象,如下代码返回的结果都为true:

复制代码
public class Client {
    public static void main(String[] args) throws Exception {
        //类的属性class所引用的对象与实例对象的getClass返回值相同
        String.class.equals(new String().getClass());
        "ABC".getClass().equals(String.class);
        //class实例对象不区分泛型
        ArrayList.class.equals(new ArrayList<String>().getClass());
    }
}
复制代码

Class类是Java的反射入口,只有在获得一个类的描述对象后才能动态的加载,调用,一般获得一个Class对象有三种途径:

1.类属性方式,如String.class.

2.对象的getClass()方法,如new String().getClass().

3.forName()方法加载,如Class.forName("java.lang.String");

获得了Class对象之后,就可以通过getAnnotation()获得注解,通过getMethods()获得方法,通过getConstructors()获得构造函数等,这为后续的反射代码铺平了道路.


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5626078.html,如需转载请自行联系原作者

相关文章
|
9月前
|
编译器
特殊类设计
特殊类设计
71 0
|
9月前
|
设计模式 安全 Java
特殊类的设计
特殊类的设计
52 0
|
设计模式 JavaScript 前端开发
class 继承的重点
前文已提过:在 class 出现之前,JavaScript 实现继承是件麻烦事,构造函数继承有加上原型上的函数不能复用的问题;原型链继承又存在引用值属性的修改不独立的问题;组合继承又存在两次调用构造函数的问题,寄生组合继承,写起来又太麻烦了,总之,在 class 出现前,JavaScipt 实现继承真是件麻烦事儿。
|
存储 Java 程序员
深入理解Java中的三个修饰符(抽象(abstract)、静态(static)和最终的,不可变(final))【配视频】
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
274 0
深入理解Java中的三个修饰符(抽象(abstract)、静态(static)和最终的,不可变(final))【配视频】
20、利用class创建对象,防止数据覆盖
20、利用class创建对象,防止数据覆盖
40 0
|
C++
<C++> 类和对象之封装,精准区分class与struct
<C++> 类和对象之封装,精准区分class与struct
72 0
|
存储 Java
类与类的关系
## 继承关系 1.子类想要继承父类,通过extends关键字来实现 2.子类继承了父类,可以调用父类中(public protected)的属性和方法 2.1构造方法严格意义来说 不算做子类继承过来 只是单纯的在子类调用构造方法时默认调用父类的构造方法 2.2程序块严格意义来说 不算做子类继承过来(子类自己调用不到 没名字) 程序块子类不能直接调用 子类执行构造方法之前 默认调用了父类的构造方法 父类构造方法之前自动执行父类的块 3.子类除了能继承父类的属性和方法外,子类还可以添加自己独有的成员(属性 方法)
92 0
|
安全 C# 索引
C#编程基础——类
C#编程基础——类
C#编程基础——类
|
程序员
组合、继承、内部类什么时候用,该怎么设计?
组合、继承、内部类什么时候用,该怎么设计?
116 0
组合、继承、内部类什么时候用,该怎么设计?