Class对象

RTTI

我们要知道,Java让我们在运行时识别对象和类信息,主要通过两种方式,一种就是传统的RTTI,另一种是反射(Reflection)。两者的区别是,RTTI是在编译时就获得了所有类型信息,而反射是在运行时发现和使用类的信息。
RTTI分为三种形式:
1:传统的类型转换,例如经典的Animal的子类上转时类型转换。
2:Class对象,通过查询Class对象可以获得运行时所需的信息。
3:关键字instanceof,返回boolean,告诉我们对象是否是某个特定的实例。

重点谈Class

Java的ATTI就是通过Class对象来执行的,它包含了与类有关的所有信息,例如该类的父类,接口,构造方法,成员等,它本身就是用于创建类的所有常规对象的。

类的加载
每一个类都有一个Class对象,每编译一个类,就会生成相应的.class文件,这些.class文件都会被类加载器(ClassLoader)加载到JVM中,并且会产生一个Class对象,保存在内存中。一旦类的Class对象载入内存,他就用来创建这个类的所有对象。实际上我们通过new来创建对象,内部就是通过Class来创建的。

获取Class对象引用的三种方式

一:Class.forname(”java.lang.String”);这里的参数必须为全限定类名
二:对象.getClass()
三:类字面常量(String.class)

Class的常用方法:

  1. getName():获取限定类名
  2. getSimpleName():只获取类名
  3. getSuperClass():获取该类的父类
  4. getInterfaces():获取该类的接口
    更多方法参考api文档
class A{}
interface B{}
class C extends A implements B{}

public class TestClass {

    public static void main(String[] args) {
        //1.类字面常量
        Class<?> c = C.class;
        //2.Class.forName()形式
        //Class<?> c = Class.forName("test.C");

        //3.对象.getClass()形式
        //Class<?> c = new C().getClass();

        System.out.println(c.getName());
        System.out.println(c.getSimpleName());
        System.out.println(c.getCanonicalName());

        System.out.println(c.getSuperclass());
        System.out.println(c.getInterfaces()[0]);

    }
}

结果为:

test.C
C
test.C
class test.A
interface test.B

forName()和.class形式的区别

看这段代码:

class A{
    static{
        System.out.println("This is A");
    }
}

class B{
    static{
        System.out.println("This is B");
    }
}

public class TestClass {

    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> a = A.class;
        System.out.println("After A");
        new A();

        Class<?> b = Class.forName("test.B");
        System.out.println("Ager B");
    }
}

分别是两种形式调用,结果如下:

After A
This is A
This is B
Ager B

说明什么问题?很明显,.class的形式并不会执行类中的static块,而forName则会立马执行类中的statiic块。也就是说,.class不会对类进行初始化,而forName立即就进行了初始化。这就是两者最大的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值