深入研究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
分享到:
相关推荐
此外,还可能包含了对异常处理的便捷工具,比如`ExceptionUtils`,以及对反射操作的支持,如`ClassUtils`。 在实际开发中,Apache Commons Lang库常常被用来增强基本的Java功能。例如,`ArrayUtils`可以方便地操作...
3. 类型转换:ClassUtils可以方便地进行类名与类对象之间的转换,而NumberUtils则提供了各种数值类型间的转换方法。 4. 枚举操作:EnumUtils为枚举类型提供了创建、比较和遍历的工具,使枚举的使用更加灵活。 5. ...
《Apache Commons Lang 3.1:Java编程的强大工具》 ...无论是在日常的编码还是大型项目中,Lang库都值得我们广泛使用和深入研究。通过熟练掌握Lang库,我们可以提高代码质量,减少重复工作,从而提升开发效率。
3. **ClassUtils**:提供类和类名的操作,如加载类、获取类的全名、检查类是否存在于类路径中等。 4. **DateUtils**:简化了日期和时间的处理,提供了一些方便的函数来创建、解析和比较日期。 5. **ExceptionUtils...
源码层面上,深入研究其设计思想和实现细节,可以提升编程技能和对 Java 核心概念的理解。 在实际开发中,选择合适的 Apache Commons 组件可以大大简化任务,提高代码质量。了解每个组件的特性和用途,结合项目需求...
6. **反射机制**:`ClassUtils`增强了Java的反射功能,可以方便地获取类信息、创建实例、检查方法等。 7. **枚举处理**:`EnumUtils`提供了对枚举类型的处理,包括枚举值的比较、查找、遍历等。 8. **异常处理**:...
* See full code here: https://github.com/davinkevin/Podcast-Server/blob/d927d9b8cb9ea1268af74316cd20b7192ca92da7/src/main/java/lan/dk/podcastserver/utils/multipart/MultipartFileSender.java ...
9. **Class utilities**:`ClassUtils`提供了类相关的操作,如获取类的实例、检查类是否实现了接口或扩展了类等。 10. **Character utilities**:`CharacterUtils`提供了对字符的操作,如大小写转换、检测空白字符...
而工具类(Utils)通常包含一些静态方法,提供便利的功能,如字符串处理、日期时间操作等,减少重复代码。 这个压缩包可能包含了一些Swing程序的示例和实用的工具类,对于学习和理解Java对象存储和读取,以及Swing...
通过深入研究`commons-lang-2.0-src`源码,不仅可以提升Java编程技能,还能了解到开源软件的设计模式、编程规范以及如何写出高质量、可维护的代码。此外,对于希望参与开源项目或者成为更优秀开发者的人来说,这是一...
通过深入研究Apache Commons Lang 2.6的源码,我们可以学到如何编写高效、易用、可维护的Java工具类,以及如何利用设计模式和最佳实践来优化代码。同时,这也是了解和学习Java生态的一个重要窗口。
4. **反射工具**:FieldUtils、MethodUtils 和 ClassUtils 提供了对类、字段和方法的反射操作,方便在运行时获取和操作类的信息。 5. **异常处理**:ExceptionUtils 提供了处理和包装异常的方法,可以更方便地进行...
3. **ClassUtils**:处理类和类加载器的工具,如获取类的全名、比较类等。 4. **DateUtils**:提供日期和时间的便利操作,如格式化、解析和比较。 5. **NumberUtils**:处理数字的工具类,包括安全的转换和比较。 6....
标题中的"commons-lang3-3.5-src"表明这是一个源代码包,开发者可以深入研究源代码,理解其内部工作原理,或者根据需要进行自定义修改和扩展。 标签"commons-lang"直接指向了Apache Commons Lang项目,该项目是由...
4. **反射工具**:`ClassUtils`提供了丰富的反射操作,如获取类的方法、属性,以及类与类之间的关系判断。 5. **异常处理**:`ExceptionUtils`和`Throwables`提供了更灵活的异常处理方式,如堆栈跟踪的获取和打印,...
4. **反射工具**:`ClassUtils`和`ReflectionUtils`提供了对类和对象的反射操作,如获取类名、构造函数、字段和方法等。 5. **枚举处理**:`EnumUtils`提供了对Java枚举类型的处理,包括枚举值的获取、检查等。 6....
通过阅读和研究"commons-lang-源码跟帮助"中的源代码,你可以深入了解这些工具类的工作原理,并学习如何在实际项目中更高效地利用它们。同时,源代码也展示了良好的编程实践和设计模式,对于提升你的编程技巧...
5. **ClassUtils**: 为Java的反射操作提供了便利,包括获取类信息、转换类、比较类等,使得类操作更为便捷。 6. **DateUtils**: 提供了日期和时间的处理方法,如格式化、解析、比较等,比Java的`java.util.Date`类...
6. **反射工具**:`ClassUtils` 类提供了有关类的实用工具,如获取类名、检查类关系、实例化对象等。反射在 Java 开发中非常重要,这些工具可以简化相关操作。 7. **异常处理**:`ExceptionUtils` 可以帮助处理和...