zoukankan      html  css  js  c++  java
  • [改善Java代码]注意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()获得构造函数等,这为后续的反射代码铺平了道路.

  • 相关阅读:
    Spring相关知识点
    动态代理jdk和cglib的区别
    keepalived+nginx+tomcat+redis集群环境部署
    MongoDB_4.4 安装和配置
    vsCode 账号间同步 配置,插件
    vue 全局导航 router.beforeEach()
    网页左右两边元素高度自适应,两个元素高度一致,一面高度跟随另一面的高度变化而变化
    git 中 ssh key 的生成
    vscode html 自定义模板
    vscode vue 定义 单文件模板
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5626078.html
Copyright © 2011-2022 走看看