`

java.lang.Class<T> 研究

阅读更多

        

      Class对象包含了与类相关的信息。

Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。
      Class
没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
     
虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
     
基本的 Java 类型(booleanbytecharshortintlongfloat double)和关键字 void 也都对应一个 Class 对象。
     
每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
     
一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

 

 

示例:

         package clientDemo;

 

class Candy {

    static {

       System.out.println("Loading Candy");

    }

}

 

class Gum {

    static {

       System.out.println("Loading Gum");

    }

}

 

class Cookie {

    static {

       System.out.println("Loading Cookie");

    }

}

 

public class Demo {

    public static void main(String[] args) {

       System.out.println("inside main");

       new Candy();

       System.out.println("After creating Candy");

       try {

           Class.forName("com.zj.sample.Gum");

       } catch (ClassNotFoundException e) {

           System.out.println("Couldn't find Gum");

       }

       System.out.println("After Class.forName(\"Gum\")");

       new Cookie();

       System.out.println("After creating Cookie");

    }

}

 

运行结果:

inside main
        Loading Candy
        After creating Candy
        Couldn't find Gum
       After Class.forName("Gum")
       Loading Cookie
       After creating Cookie

 

 


 

一、如何得到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方法会返回奇怪的名字。   对于基本数据类型的封转类,还可以用.TYPE来获取对应基本数据类型的Class实例。

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

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

    3getClassLoader()
   
返回该类的类加载器。

    4getComponentType()
   
返回表示数组组件类型的 Class

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

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

7forName()

这个方法是Class类(所有Class对象都属于这个类)的一个static成员。Class对象就和其它对象一样,我们可以获取并操作它的引用。forName()是取得Class对象的引用的一种方法。它是用一个包含目标类的文本名的String作输入参数,返回的是一个Class对象的引用。

8isInstance()

Class.isInstance()方法提供了一种动态地调用instanceof运算符的途径。

 

9Class.getInterfaces()

返回Class对象的数组,这些对象代表的是某个Class对象所包含的接口。

 

10getSuperclass()

如果有一个Class对象,那么就可以通过getSuperclass()获取它的直接基类。这个方法自然也是返回一个Class引用,所以可以进一步查询其基类。这意味着在运行时,可以找到一个对象完整的类层次结构。

 

 

三、Class的一些使用技巧
    1
forNamenewInstance结合起来使用,可以根据存储在字符串中的类名创建对象。例如
    Object obj = Class.forName(s).newInstance();

2、虚拟机为每种类型管理一个独一无二的Class对象。因此可以使用==操作符来比较类对象。例如:
    if(e.getClass() == Employee.class)...

 

或者使用instanceOf来判断一个实例化对象是否是某一个特定类的实例。

 

资料参考:http://tech.ccidnet.com/art/3539/20070620/1118939_1.html

http://lavasoft.blog.51cto.com/62575/15433

分享到:
评论

相关推荐

    Java.lang.reflect 包下常用的类及方法简介

    `Constructor&lt;T&gt;`代表类`T`的一个构造函数。 - `newInstance(Object... initargs)`:使用构造函数的新实例,传递初始化参数。 3. **Method类**: - 表示类的方法。 - `invoke(Object obj, Object... args)`:...

    Java测试题2答案

    下列说法正确的是 BC&lt;br&gt;A java.lang.Clonable是类&lt;br&gt;B java.lang.Runnable是接口&lt;br&gt;C Double对象在java.lang包中&lt;br&gt;D Double a=1.0是正确的java语句&lt;br&gt;9.指出正确的表达式AB&lt;br&gt;&lt;br&gt;B Double a=new Double(1.0)...

    JSTL详细标签库介绍

    target=_blank&gt;更多...&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt; &lt;DIV id=right1&gt;&lt;BR&gt; &lt;H2&gt;关于java异常处理(讲义)&lt;/H2&gt;&lt;BR&gt;&lt;BR&gt; &lt;DIV align=right&gt;作者:&nbsp;&nbsp;&nbsp;&nbsp;文章来源:&lt;BR&gt;发布日期:2006年07月21日&nbsp;&...

    java.lang.Class类

    如果T是一个Java类型,那么T.class就代表了匹配的类对象。 Class类的常用方法包括: 1. getName():返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称。 2. newInstance():可以为类创建一个...

    Can't find a codec for class java.math.BigDecimal.txt

    解决mongo数据插入时 报错问题 mogodb插入数据时报错Can't find a codec for class java.math.BigDecimal

    Mybatis单个参数的if判断报异常There is no getter for property named 'xxx' in 'class java.lang.Integer'的解决方案

    如果按照处理对象类型的参数方式直接在`&lt;if&gt;`中使用参数名,可能会遇到异常`There is no getter for property named 'xxx' in 'class java.lang.Integer'`。这是因为MyBatis在寻找getter方法时找不到对应的属性,...

    SpringBoot+Mybatis-Plus整合Sharding-JDBC5.1.1实现单库分表【全网最新】.doc

    &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt; &lt;version&gt;8.0.23&lt;/version&gt; &lt;/dependency&gt; &lt;!-- MyBatis Plus Starter --&gt; &lt;dependency&gt; &lt;groupId&gt;com.baomidou&lt;/groupId&gt; &lt;artifactId&gt;mybatis-plus-boot-...

    Android 兼容性问题:java.lang.UnsupportedOperationException解决办法

    "Android 兼容性问题:java.lang.UnsupportedOperationException解决办法" Android 兼容性问题:java.lang.UnsupportedOperationException解决办法是 Android 开发中常见的一种问题。该问题会导致应用程序崩溃,...

    Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’; nested except

    Type 异常报告 消息 Failed to convert ... nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Date': no matching editors or co

    Android Caused by: java.lang.ClassNotFoundException解决办法

    Android Caused by: java.lang.ClassNotFoundException解决办法 出现问题: 08-13 18:29:22.924: E/AndroidRuntime(1875): Caused by: Java.lang.ClassNotFoundException:XXXXX in loader dalvik.system....

    入研究java.lang.ThreadLocal类.docx

    ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal&lt;&gt;(); ``` ##### T get() **用途**:返回当前线程所持有的 ThreadLocal 变量的副本。如果这是线程第一次访问,则会创建并初始化该副本。 **示例代码**: ```...

    Eos命名Sql调用总结定义.pdf

    [CDATA[ select t.empcode,t.empname,t.birthday from emp t where t.empcode = #empCode# and t.sex = #sex# ]]&gt; &lt;/select&gt; ``` 2. **基本类型的result** - 当查询结果只需要一个基本类型的值(如整数)时,...

    学习笔记 java\CoreJava笔记\CoreJava_day23

    - `java.lang.Class&lt;T&gt;`:这个类是反射的入口,每个Java类和接口都对应一个`Class`对象。它提供了获取类信息、创建对象、访问字段和方法的接口。 - `java.lang.reflect.Field`:代表类的字段,用于获取和设置字段...

    apkpatch1.0.3阿里热更新工具以及使用说明.zip

     -keep class * extends java.lang.annotation.Annotation  -keepclasseswithmembernames class * {  native &lt;methods&gt;;  }  -keep class com.alipay.euler.andfix.** { *; }  2. 打补丁包,首先生成一...

    java泛型、原始类型、桥接方法

    例如,假设我们有一个泛型类 Pair&lt;T&gt;,其中的方法 setFirst(T first) 将被擦除为 setFirst(java.lang.Object first)。为了避免类型不匹配问题,编译器将生成一个桥接方法: ```java public void setFirst(java.lang...

    java 空指针异常(NullPointerException)

    - **使用Optional**:Java 8引入的`Optional&lt;T&gt;`可以帮助避免空指针异常,它提供了一种更安全的方式来封装可能为null的值。 - **避免返回null**:设计方法时尽量避免返回null,而应返回一个默认值或抛出异常。 ### ...

    Java-反射笔记.pdf

    在Java中,反射机制是通过java.lang.Class类和java.lang.reflect包来实现的。本笔记将深入探讨Java反射的原理、用途以及如何使用。 一、反射的概念与作用 反射是Java提供的一种能力,它允许程序在运行时动态地获取...

    JSP_tag.rar_Eclipse_eclipse jsp t_jsp custom tag_自定义标签

    &lt;type&gt;java.lang.String&lt;/type&gt; &lt;/attribute&gt; &lt;/tag&gt; ``` 这里,`tag-class`指定的是处理这个标签的Java类,`body-content`指定了标签内容的处理方式,`attribute`定义了标签的属性。 接着,我们需要编写对应的...

Global site tag (gtag.js) - Google Analytics