`
jyangzi5
  • 浏览: 212257 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

深入理解java.lang.Class

阅读更多
深入理解java.lang.Class类
 

      Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。
      Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
      虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
      基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。
      每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
      一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
 
一、如何得到Class的对象呢?有三种方法可以的获取:
    1、调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如:
    MyObject x;
    Class c1 = x.getClass();
    2、使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如:
    Class c2=Class.forName("MyObject"),Employee必须是接口或者类的名字。
    3、获取Class类型对象的第三个方法非常简单。如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如
    Class cl1 = Manager.class;
    Class cl2 = int.class;
    Class cl3 = Double[].class;
    注意:Class对象实际上描述的只是类型,而这类型未必是类或者接口。例如上面的int.class是一个Class类型的对象。由于历史原因,数组类型的getName方法会返回奇怪的名字。
二、Class类的常用方法
    1、getName()
    一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
    2、newInstance()
    Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:
    x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
    3、getClassLoader()
    返回该类的类加载器。
    4、getComponentType()
    返回表示数组组件类型的 Class。
    5、getSuperclass()
    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
    6、isArray()
    判定此 Class 对象是否表示一个数组类。
三、Class的一些使用技巧
    1、forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象。例如
    Object obj = Class.forName(s).newInstance();
    2、虚拟机为每种类型管理一个独一无二的Class对象。因此可以使用==操作符来比较类对象。例如:
    if(e.getClass() == Employee.class)...
分享到:
评论

相关推荐

    出现Exception in threadmain java.lang.NoClassDefFoundError的各种可能情况.doc

    解决这类问题的关键在于理解Java的类加载机制,确保类路径、文件名、类名以及包结构等元素的正确性。在复杂的项目中,使用IDE(如Eclipse、IntelliJ IDEA或VisualAge for Java)可以避免许多常见的配置错误,使开发...

    Struts的java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource异常的解决方法

    总的来说,理解并解决"java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource"这一异常,不仅需要对Struts框架有一定了解,还需要掌握Java类加载机制以及数据库连接池的基本原理。通过正确...

    在Java中异常分析

    ### 在Java中异常分析 #### 一、Java异常体系结构概览 在Java中,所有异常都继承自`java.lang....此外,深入理解Java异常处理机制有助于开发者更好地应对可能出现的各种异常情况,从而编写出更加高效稳定的代码。

    java.lang研究

    《深入解析java.lang》 Java语言的核心库之一就是`java.lang`包,它包含了Java程序设计中最基础的类和接口,...通过深入研究`java.lang`,我们可以更好地理解Java的内在机制,并能更熟练地运用这些工具来解决问题。

    java.lang.class源码-datanucleus-cache:修复java.lang.IncompatibleClassChange

    当我们使用`Class.forName()`加载类时,Java虚拟机(JVM)会解析类的字节码,生成对应的`Class`对象。这个过程涉及到类加载器(ClassLoader),它是JVM的一部分,负责查找和加载类。 在`java.lang.Class`中,`new...

    Android 出现:java.lang.NoClassDefFoundError...错误解决办法

    本文将深入探讨这个问题,特别是在Android环境中如何解决`java.lang.NoClassDefFoundError: android/os/PersistableBundle`这个特定错误。 `PersistableBundle`是Android 5.0(API Level 21)引入的一个新特性,...

    org.apache.commons.lang包

    2. **源码**:源代码允许开发者深入理解库的工作原理,便于自定义、调试或学习。对于开源项目,查看源码也是理解和学习软件设计模式的好方式。 3. **jar包**:这是编译后的二进制文件,包含了所有编译好的类。在...

    java_lang包详解.pdf

    《java_lang包详解》 Java语言的核心库之一就是java.lang包,它包含了Java程序中最基础、最...在编写Java程序时,无论何时何地,你都有可能需要用到java.lang包中的类和接口,因此深入学习和掌握这个包是至关重要的。

    java.lang.NoClassDefFoundError:

    ### Java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory #### 错误概述 ...对于初学者来说,这类问题可能显得较为复杂,但随着对Java生态系统的深入理解,处理起来会越来越得心应手。

    JBuider第六章:Java.lang包.rar

    在"JBuider第六章:Java.lang包"的教程中,你可能会深入学习到以下几个关键知识点: 1. **基础类和接口**:Java.lang包中的基础类包括`Object`、`String`、`Integer`、`Boolean`等,它们构成了Java类层次结构的基础...

    studio碰到问题:java.lang.UnsatisfiedLinkError解决办法

    Java中的`java.lang.UnsatisfiedLinkError`是一个常见的运行时异常,通常出现在Java试图加载本地(C或C++)库时找不到相应的函数或者方法。在Android开发中,尤其是在使用JNI(Java Native Interface)进行跨语言...

    java.lang.NoSuchMethodException: .getPortClassMap()

    3. **反射调用**:如果使用反射来调用方法,需要确保在运行时类的实例上正确地执行了 `Class.getMethod()` 或 `Class.getDeclaredMethod()` 方法,并且该方法确实存在于目标类中。 4. **更新依赖**:有时,第三方库...

    java 请求的方法不存在(NoSuchMethodException)

    2. **反射操作**:在使用Java反射API(如`Class.getMethod()`或`Class.getDeclaredMethod()`)时,如果没有找到指定的方法,也会抛出此异常。 3. **动态代理**:在使用Java动态代理生成的代理类中,如果尝试调用的...

    java开发常遇问题和解决

    在Java开发过程中,...对于每一个问题,都需要开发者具备扎实的Java基础,对语言特性和框架有深入理解,并且能够熟练使用各种调试和分析工具。通过不断学习和实践,可以逐渐克服这些问题,提升开发效率和代码质量。

    java开发-com.alibaba.fastjson.JSONObject

    理解并熟练使用`JSONObject`可以极大地提高开发效率,同时Fastjson库还提供了其他丰富的功能,如处理JSON数组`JSONArray`、处理日期、自定义序列化和反序列化等,这都需要开发者根据具体需求去深入学习和掌握。

    java.lang.Void类的解析与使用详解

    Java中的`java.lang.Void`类是一个特殊的类,它在Java标准库中扮演着重要的角色,尤其是在处理泛型和反射时。`Void`类是不可实例化的,它的...理解`Void`类及其用法对于深入学习Java的类型系统和API的使用至关重要。

    Java rt.jar 源码分析

    深入理解rt.jar的源码对于提升Java编程技能和优化性能至关重要。 首先,我们来看一下rt.jar中的主要组成部分。rt.jar包含了许多Java API的实现,这些API被组织在不同的包下,如`java.lang`、`java.util`、`java.io`...

    Java rt.jar源码

    例如,`java.lang.reflect`包中的`Class`类提供了反射机制,允许程序在运行时动态获取类的信息并调用方法;`java.util.concurrent`包提供了高效的并发工具类,如`ExecutorService`、`Semaphore`等,方便开发者进行多...

    java 找不到指定类时发生的异常(ClassNotFoundException)

    在Java编程语言中,`ClassNotFoundException`是一个非常常见的运行时异常,它属于`java.lang.ClassNotFoundException`,当Java虚拟机(JVM)试图动态加载一个类并无法找到对应的.class文件时,就会抛出这个异常。...

    java学习资料-反射机制深入理解剖析

    2. 实例化一个类的对象,通过`Class.forName()`,`new TestReflect().getClass()`或直接使用`TestReflect.class`等方式。 3. 查找类的父类和实现的接口,使用`getSuperclass()`和`getInterfaces()`方法。 此外,...

Global site tag (gtag.js) - Google Analytics