前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java的Class对象

Java的Class对象

作者头像
Tyan
发布2019-05-25 23:25:07
5910
发布2019-05-25 23:25:07
举报
文章被收录于专栏:SnailTyanSnailTyan

1. Class对象

在Java中有两种对象:Class对象和实例对象,实例对象是类的实例,通常是通过new关键字构建的。Class对象是JVM生成用来保存对象的类的信息的。Java程序执行之前需要经过编译、加载、链接和初始化这几个阶段,编译阶段会将源码文件编译为.class字节码文件,编译器同时会在.class文件中生成Class对象,加载阶段通过JVM内部的类加载机制,将Class对象加载到内存中。在创建对象实例之前,JVM会先检查Class对象是否在内存中存在,如果不存在,则加载Class对象,然后再创建对象实例,如果存在,则直接根据Class对象创建对象实例。JVM中只有一个Class对象,但可以根据Class对象生成多个对象实例。

2. Class对象的获得

2.1 类名.class

当执行类名.class时,JVM会先检查Class对象是否装入内存,如果没有装入内存,则将Class对象装入内存,然后返回Class对象,如果装入内存,则直接返回Class对象。在加载Class对象后,不会对Class对象进行初始化。

  • Example
public class Test {

    static {
        System.out.println("Run static initialization block.");
    }

    {
        System.out.println("Run nonstatic initialization block.");
    }
}

public class ClassTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Class t = Test.class;
    }
}
  • Result
// 空

2.2 Class.forName()

当执行Class.forName()时,JVM也会先检查Class对象是否装入内存,如果没有装入内存,则将Class对象装入内存,然后返回Class对象,如果装入内存,则直接返回Class对象。在加载Class对象后,会对类进行初始化,即执行类的静态代码块。forName()方法中的参数是类名字符串,类名字符串 = 包名 + 类名。Class.forName()的一个很常见的用法是在加载数据库驱动的时候。

  • Example
package com.tyan.test;

public class Test {

    static {
        System.out.println("Run static initialization block.");
    }

    {
        System.out.println("Run nonstatic initialization block.");
    }
}


package com.tyan.test;

public class ClassTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            Class t = Class.forName("com.tyan.test.Test");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  • Result
Run static initialization block.

2.3 getClass()

getClass()方法的方法是在通过的类的实例调用的,即已经创建了类的实例。

  • Example
public class Test {

    static {
        System.out.println("Run static initialization block.");
    }

    {
        System.out.println("Run nonstatic initialization block.");
    }
}

public class ClassTest {

    public static void main(String[] args) {
        Test t = new Test();
        Class test = t.getClass();
    }
}
  • Result
Run static initialization block.
Run nonstatic initialization block.

3. Class类的常用方法

  • getName()

一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以String的形式返回此Class对象所表示的实体(类、接口、数组类、基本类型或void名称。

  • newInstance()

Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。

  • getClassLoader()

返回该类的类加载器。

  • getComponentType()

返回表示数组组件类型的Class。

  • getSuperclass()

返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的Class。

  • isArray()

判定此 Class 对象是否表示一个数组类。

4. 反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Class对象的获得是Java反射的基础,Java的反射是另一块内容,本文不涉及。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年01月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Class对象
  • 2. Class对象的获得
    • 2.1 类名.class
      • 2.2 Class.forName()
        • 2.3 getClass()
        • 3. Class类的常用方法
        • 4. 反射
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档