`

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测试题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)...

    ibatis 开发指南(pdf)

    mysql://localhost/sample"/&gt; &lt;br&gt;&lt;property name="JDBC.Username" ="user"/&gt; &lt;br&gt;&lt;property name="JDBC.Password" ="mypass"/&gt; &lt;br&gt;&lt;property name=&lt;br&gt;value="10"/&gt; &lt;br&gt;&lt;property name=value="5"/&gt; &lt;br&gt;&lt;property...

    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;&...

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

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

    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....

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

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

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

    主要介绍了Android 兼容性问题:java.lang.UnsupportedOperationException解决办法的相关资料,需要的朋友可以参考下

    源代码 Java源码 java画图板

    import java.lang.*; /**the class used to show the image*/ public class DrawPanel extends JPanel { /**store each shape*/ public Vector&lt;ImageInfo&gt; store; /**the creation function*/ DrawPanel() ...

    用JSP和数据库做的购物车的源程序

    <jsp:useBean id="bka" scope="page" class="shop.bka" /> <% String product_type; String action; int product_id; int curpage; //商品类型 if (request.getParameter("product_type")==null){ product_type...

    反射、注解类型、工厂设计模式.md

    .`java.lang.Class&lt;T&gt;类​ ==Class代表类型的类== ​ 如果一个对象代表一个类型,则该对象的类型的是Class ​ ==一个Class对象对应一个类型,封装了对应的类型的所有信息== ​ 任何类型加载到JVM内存后对应的都是...

    数据库工具类DatabaseUtil.java

    * &lt;code&gt;UPDATE&lt;/code&gt;, or &lt;code&gt;DELETE&lt;/code&gt; statement or an SQL * statement that returns nothing, such as an SQL DDL statement. 执行给定的 SQL * 语句, 这些语句可能是 INSERT, UPDATE 或者 DELETE ...

    JDK 1.5的泛型實現(Generics in JDK 1.5)

    template&lt;&gt;,藉此告訴編譯器哪些符號是 型別參數( type parameters),如圖 8。 template &lt;typename T&gt; class Rect : public Shape 侯捷觀點 JDK 1.5的泛型實現(Generics in JDK 1.5)7 { ...

    java解析Properties配置文件为对象Bean

    public static &lt;T&gt; T paseObject(String propPath, Class&lt;T&gt; cls) throws InstantiationException, IllegalAccessException, IOException { Properties prop = getConfigProperties(propPath); T obj = cls....

    Json解析ParsreTools.zip

    Class&lt;T&gt; cls) { T t = null; Field fields[] = cls.getDeclaredFields(); String varName[] = new String[fields.length]; for (int i = 0; i &lt; fields.length; i++) { varName[i] = fields[i]....

    \java超强笔记(超级经典)

    public class MyExpection&lt;T&gt; extends Exception{ } //编译错误 可以抛出(throws)泛型类,但catch的参数不能是泛型类。 注意: 编译时类型的泛型和运行时类型的泛型一定要一致,没有多态。 ...

    Java 高级特性.doc

    &gt; classType = Class.forName(java.lang.String); 例子: a..使用?通配符可以引用其他各种参数化的类型,但不能调用与参数化有关的方法; Collection&lt;?&gt; c = new Vector&lt;String&gt;(); c.add("abc");//报错 c.size();...

    ReLinker:适用于Android的强大本机库加载器

    重新链接器 强大的Android本机库加载...at com.your.app.NativeClass.&lt;clinit&gt;(Native.java:16) ... 63 more Caused by: java.lang.UnsatisfiedLinkError: Library stlport_shared not found at java.lang.Runtime.lo

    ssh(structs,spring,hibernate)框架中的上传下载

    7. <id name="fileId" type="java.lang.String" column="FILE_ID"> 8. <generator class="uuid.hex"/> 9. </id> 10. <property name="fileContent" 11. type="org.springframework.orm.hibernate3.support....

    从面试题中看java的Reference(引用)

    常见的面试中会有这么一道题,“谈谈强引用、 软引用、 弱引用、虚引用”。  A:强引用,通过new出来的都是强引用  Q:那弱引用呢?...  Class Reference&lt;T&gt;  java.lang.Object  java.lan

Global site tag (gtag.js) - Google Analytics