服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|易语言|

服务器之家 - 编程语言 - JAVA教程 - JAVA反射机制中getClass和class对比分析

JAVA反射机制中getClass和class对比分析

2021-02-06 11:55zhouyy40308 JAVA教程

这篇文章主要介绍了JAVA反射机制中getClass和class对比分析,具有一定参考价值,需要的朋友可以了解下。

java有两个获得类名的方法getClass()和class(),这两个方法看似一样,实则不然。这两个方法涉及到了java中的反射

所谓反射,可以理解为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码。严格地说,反射并非编程语言的特性,因为在任何一种语言都可以实现反射机制,但是如果编程语言本身支持反射,那么反射的实现就会方便很多。

类型类

要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息。Class对象就是用来创建所有“常规”对象的,Java使用Class对象来执行RTTI,即使你正在执行的是类似类型转换这样的操作。

每个类都会产生一个对应的Class对象,也就是保存在.class文件。所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。

我们知道在Java中一切都是对象,我们一般所使用的对象都直接或间接继承自Object类。Object类中包含一个方法名叫getClass,利用这个方法就可以获得一个实例的类型类。类型类指的是代表一个类型的类,因为一切皆是对象,类型也不例外,在Java使用类型类来表示一个类型。所有的类型类都是Class类的实例。

联系

一般情况下,getclass()方法和class()方法是等价的,都可以获得一个类型名,例如下面的代码:

?
1
2
3
4
5
6
7
8
9
10
class A{
    public void func(){
    }
}
public class Test {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.getClass()+" "+A.class);
    }
}

输出的结果为:classAclassA

区别:

两者最直接的区别就是,getClass()是一个类的实例所具备的方法,而class()方法是一个类的方法。

另外getClass()是在运行时才确定的,而class()方法是在编译时就确定了。

例如下面的程序:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A{
    public void func(){
    }
}
class B extends A{
}
public class Test {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        A ab = new B();
        System.out.println(a.getClass()+" "+A.class);
        System.out.println(b.getClass()+" "+B.class);
        System.out.println(ab.getClass());
        ab = a;
        System.out.println(ab.getClass());
    }
}

结果:
class A class A
class B class B
class B
class A

从最后的结果为class B来看,当出现继承和多态时,getclass和class方法的确实有所不同,因为是在运行时确定的,所以结果是ab在运行到这一时刻是所属的类型。

总结

以上就是本文关于JAVA反射机制中getClass和class异同的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。

原文链接:http://blog.csdn.net/zhouyy40308/article/details/78547300

延伸 · 阅读

精彩推荐
  • JAVA教程mybatis 插件: 打印 sql 及其执行时间实现方法

    mybatis 插件: 打印 sql 及其执行时间实现方法

    下面小编就为大家带来一篇mybatis 插件: 打印 sql 及其执行时间实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看...

    Java教程网1882020-11-24
  • JAVA教程Jax-rs规范下REST接口使用方法详解

    Jax-rs规范下REST接口使用方法详解

    这篇文章主要介绍了Jax-rs规范下REST接口使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    一马平川11682020-09-10
  • JAVA教程Java 8实现图片BASE64编解码

    Java 8实现图片BASE64编解码

    Java 8终于有了标准的方法来处理base64的编解码。Java一直缺少BASE64编码API,以至于通常在项目开发中会选用第三方的API实现。但是,Java 8实现了BASE64编解码...

    daisy5372020-06-26
  • JAVA教程java对xml节点属性的增删改查实现方法

    java对xml节点属性的增删改查实现方法

    下面小编就为大家带来一篇java对xml节点属性的增删改查实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    java教程网4282020-06-20
  • JAVA教程Java简单从文件读取和输出的实例

    Java简单从文件读取和输出的实例

    下面小编就为大家带来一篇Java简单从文件读取和输出的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    实例+练习+复习8692021-01-13
  • JAVA教程Kotlin 基础教程之类、对象、接口

    Kotlin 基础教程之类、对象、接口

    这篇文章主要介绍了Kotlin 基础教程之类、对象、接口的相关资料,需要的朋友可以参考下...

    jinkui4562020-11-26
  • JAVA教程MyBatis动态SQL标签用法实例详解

    MyBatis动态SQL标签用法实例详解

    本文通过实例代码给大家介绍了MyBatis动态SQL标签用法,非常不错,具有参考借鉴价值,需要的朋友参考下吧...

    luojishan14252020-11-29
  • JAVA教程Java中的四种单例模式浅析

    Java中的四种单例模式浅析

    这篇文章主要给大家介绍了关于Java中四种单例模式的相关资料,其中包括饿汉式、懒汉式、懒汉式(双重锁)及内部类等四种,分别给出了详细的示例代码和...

    4862020-09-29