• 三种方法获取Class对象的区别


    有关反射的内容见   java反射

    得到某个类的Class对象有三种方法:

    使用“类名.class”取得

    Class.forName(String className)

    通过该类实例对象的getClass()

    三种方法有何不同?

    类名.class      不做类的初始化工作,返回类的Class对象。

    Class.forName(String className)     做类的静态初始化,返回类的Class对象。

    ( 如果使用Class.forName(String name, boolean initialize,ClassLoader loader) ,并将initialize的值设为false,则不会进行类的静态初始化)

    实例对象的getClass()                对类进行静态初始化、非静态初始化(由于首先使用new得到类的实例对象,实际上是这一步对类进行了初始化)。

    如下示例:

    定义一个类Apple,使用上述三种方法分别得到Apple类的Class对象

    class Apple {
    
        // 构造器
        public Apple() {
            System.out.println("This is a constructor");
        }
    
        // 非静态块
        {
            System.out.println("This is a block");
        }
    
        // 静态块
        static {
            System.out.println("This is a static block");
        }
    }

    使用“类名.class”

        public static void main(String[] args) throws Exception {
    
            Class<?> appleClass = Apple.class;
        }

    没有任何输出结果。没有对类做初始化。

    Class.forName(String className)

        public static void main(String[] args) throws Exception {
            Class.forName("leetcode.Apple");
        }

    输出:This is a static block

    说明对类Apple进行了静态初始化

    通过该类实例对象的getClass()

        public static void main(String[] args) throws Exception {
            Apple apple = new Apple(); // 对类做了初始化
            Class<?> appleClass = apple.getClass();
        }

    输出:

    This is a static block
    This is a block
    This is a constructor

    对类做初始化的实际是创建类的实例时。

  • 相关阅读:
    myeclipse 8.5 workspace无故初始化
    过 DNF TP 驱动保护(二)
    LogMiner
    过 DNF TP 驱动保护(一)
    驱动列举进程输出到应用层
    [转]hookQQAPI拦截QQ聊天记录有图有码
    Oracle Grid 下载地址
    Oracle 分区表 总结
    NtQuerySystemInformation的使用
    oracle asm之添加和修改asm磁盘组
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9405630.html
Copyright © 2020-2023  润新知