`
sd4886656
  • 浏览: 90096 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Utils]深入研究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)...
 

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/15433

 

 

 

package com.zj.sample;
 
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
 
class Point {
    static {
       System.out.println("Loading Point");
    }
 
    int x, y;
 
    void output() {
       System.out.println("x=" + x + "," + "y=" + y);
    }
 
    Point(int x, int y) {
       this.x = x;
       this.y = y;
    }
}
 
class ClassTest {
    public static void main(String[] args) {
       
       try {
           Class c = Class.forName("com.zj.sample.Point");
           Constructor[] cons = c.getDeclaredConstructors();
           Class[] params = cons[0].getParameterTypes();// 察看构造器的参数信息
           Object[] paramValues = new Object[params.length];// 构建数组传递参数
           for (int i = 0; i < params.length; i++) {
              if (params[i].isPrimitive())// 判断class对象表示是否是基本数据类型
              {
                  paramValues[i] = new Integer(i);
              }
           }
           Object o = cons[0].newInstance(paramValues);// 创建一个对象的实例
           Method[] ms = c.getDeclaredMethods();// 调用方法
           ms[0].invoke(o, null);// 用指定的参数调用(output方法没有参数,null)
       } catch (Exception e) {
           e.printStackTrace();
       }
  }
}

 Loading Point

x=0,y=1

 

 

分享到:
评论

相关推荐

    commons-lang-2.4.rar代码及jar文件

    此外,还可能包含了对异常处理的便捷工具,比如`ExceptionUtils`,以及对反射操作的支持,如`ClassUtils`。 在实际开发中,Apache Commons Lang库常常被用来增强基本的Java功能。例如,`ArrayUtils`可以方便地操作...

    common-lang2.6,lang3-3.4包,源码

    3. 类型转换:ClassUtils可以方便地进行类名与类对象之间的转换,而NumberUtils则提供了各种数值类型间的转换方法。 4. 枚举操作:EnumUtils为枚举类型提供了创建、比较和遍历的工具,使枚举的使用更加灵活。 5. ...

    commons-lang3-3.1.jar_2021.07.zip

    《Apache Commons Lang 3.1:Java编程的强大工具》 ...无论是在日常的编码还是大型项目中,Lang库都值得我们广泛使用和深入研究。通过熟练掌握Lang库,我们可以提高代码质量,减少重复工作,从而提升开发效率。

    commons-lang-utils

    3. **ClassUtils**:提供类和类名的操作,如加载类、获取类的全名、检查类是否存在于类路径中等。 4. **DateUtils**:简化了日期和时间的处理,提供了一些方便的函数来创建、解析和比较日期。 5. **ExceptionUtils...

    Java常用开源框架总结.docx

    源码层面上,深入研究其设计思想和实现细节,可以提升编程技能和对 Java 核心概念的理解。 在实际开发中,选择合适的 Apache Commons 组件可以大大简化任务,提高代码质量。了解每个组件的特性和用途,结合项目需求...

    commons-lang3-3.3.2.rar

    6. **反射机制**:`ClassUtils`增强了Java的反射功能,可以方便地获取类信息、创建实例、检查方法等。 7. **枚举处理**:`EnumUtils`提供了对枚举类型的处理,包括枚举值的比较、查找、遍历等。 8. **异常处理**:...

    springmvc提供视频播放功能时,手机端无法正常播放的解决办法

    * See full code here: https://github.com/davinkevin/Podcast-Server/blob/d927d9b8cb9ea1268af74316cd20b7192ca92da7/src/main/java/lan/dk/podcastserver/utils/multipart/MultipartFileSender.java ...

    commons-lang-2.5-sources.jar源码jar包

    9. **Class utilities**:`ClassUtils`提供了类相关的操作,如获取类的实例、检查类是否实现了接口或扩展了类等。 10. **Character utilities**:`CharacterUtils`提供了对字符的操作,如大小写转换、检测空白字符...

    Java存储与读取对象.rar

    而工具类(Utils)通常包含一些静态方法,提供便利的功能,如字符串处理、日期时间操作等,减少重复代码。 这个压缩包可能包含了一些Swing程序的示例和实用的工具类,对于学习和理解Java对象存储和读取,以及Swing...

    commons lang 源码

    通过深入研究`commons-lang-2.0-src`源码,不仅可以提升Java编程技能,还能了解到开源软件的设计模式、编程规范以及如何写出高质量、可维护的代码。此外,对于希望参与开源项目或者成为更优秀开发者的人来说,这是一...

    commons-lang-2.6-src.zip

    通过深入研究Apache Commons Lang 2.6的源码,我们可以学到如何编写高效、易用、可维护的Java工具类,以及如何利用设计模式和最佳实践来优化代码。同时,这也是了解和学习Java生态的一个重要窗口。

    commons-lang-2.4-src

    4. **反射工具**:FieldUtils、MethodUtils 和 ClassUtils 提供了对类、字段和方法的反射操作,方便在运行时获取和操作类的信息。 5. **异常处理**:ExceptionUtils 提供了处理和包装异常的方法,可以更方便地进行...

    commons-lang3-3.12.0.7z

    3. **ClassUtils**:处理类和类加载器的工具,如获取类的全名、比较类等。 4. **DateUtils**:提供日期和时间的便利操作,如格式化、解析和比较。 5. **NumberUtils**:处理数字的工具类,包括安全的转换和比较。 6....

    commons-lang3-3.5-src

    标题中的"commons-lang3-3.5-src"表明这是一个源代码包,开发者可以深入研究源代码,理解其内部工作原理,或者根据需要进行自定义修改和扩展。 标签"commons-lang"直接指向了Apache Commons Lang项目,该项目是由...

    commons-lang3-3.1-src.tar.gz

    4. **反射工具**:`ClassUtils`提供了丰富的反射操作,如获取类的方法、属性,以及类与类之间的关系判断。 5. **异常处理**:`ExceptionUtils`和`Throwables`提供了更灵活的异常处理方式,如堆栈跟踪的获取和打印,...

    commons-lang3-3.4-src commons lang 3.3.4 src 源码

    4. **反射工具**:`ClassUtils`和`ReflectionUtils`提供了对类和对象的反射操作,如获取类名、构造函数、字段和方法等。 5. **枚举处理**:`EnumUtils`提供了对Java枚举类型的处理,包括枚举值的获取、检查等。 6....

    commons-lang-源码跟帮助

    通过阅读和研究"commons-lang-源码跟帮助"中的源代码,你可以深入了解这些工具类的工作原理,并学习如何在实际项目中更高效地利用它们。同时,源代码也展示了良好的编程实践和设计模式,对于提升你的编程技巧...

    openlogic-commons-lang-2.4-all-bin-1

    5. **ClassUtils**: 为Java的反射操作提供了便利,包括获取类信息、转换类、比较类等,使得类操作更为便捷。 6. **DateUtils**: 提供了日期和时间的处理方法,如格式化、解析、比较等,比Java的`java.util.Date`类...

    commons-lang3-3.3.2-src

    6. **反射工具**:`ClassUtils` 类提供了有关类的实用工具,如获取类名、检查类关系、实例化对象等。反射在 Java 开发中非常重要,这些工具可以简化相关操作。 7. **异常处理**:`ExceptionUtils` 可以帮助处理和...

Global site tag (gtag.js) - Google Analytics