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对象被载入内存,它就用来创建这个类的所有对象。
示例:
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)名称。
2、newInstance()
Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:
x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
3、getClassLoader()
返回该类的类加载器。
4、getComponentType()
返回表示数组组件类型的 Class。
5、getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
6、isArray()
判定此 Class 对象是否表示一个数组类。
7、forName()
这个方法是Class类(所有Class对象都属于这个类)的一个static成员。Class对象就和其它对象一样,我们可以获取并操作它的引用。forName()是取得Class对象的引用的一种方法。它是用一个包含目标类的文本名的String作输入参数,返回的是一个Class对象的引用。
8、isInstance()
Class.isInstance()方法提供了一种动态地调用instanceof运算符的途径。
9、Class.getInterfaces()
返回Class对象的数组,这些对象代表的是某个Class对象所包含的接口。
10、getSuperclass()
如果有一个Class对象,那么就可以通过getSuperclass()获取它的直接基类。这个方法自然也是返回一个Class引用,所以可以进一步查询其基类。这意味着在运行时,可以找到一个对象完整的类层次结构。
三、Class的一些使用技巧
1、forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象。例如
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
分享到:
相关推荐
`Constructor<T>`代表类`T`的一个构造函数。 - `newInstance(Object... initargs)`:使用构造函数的新实例,传递初始化参数。 3. **Method类**: - 表示类的方法。 - `invoke(Object obj, Object... args)`:...
下列说法正确的是 BC<br>A java.lang.Clonable是类<br>B java.lang.Runnable是接口<br>C Double对象在java.lang包中<br>D Double a=1.0是正确的java语句<br>9.指出正确的表达式AB<br><br>B Double a=new Double(1.0)...
target=_blank>更多...</A> </LI></UL></DIV> <DIV id=right1><BR> <H2>关于java异常处理(讲义)</H2><BR><BR> <DIV align=right>作者: 文章来源:<BR>发布日期:2006年07月21日 &...
如果T是一个Java类型,那么T.class就代表了匹配的类对象。 Class类的常用方法包括: 1. getName():返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称。 2. newInstance():可以为类创建一个...
解决mongo数据插入时 报错问题 mogodb插入数据时报错Can't find a codec for class java.math.BigDecimal
如果按照处理对象类型的参数方式直接在`<if>`中使用参数名,可能会遇到异常`There is no getter for property named 'xxx' in 'class java.lang.Integer'`。这是因为MyBatis在寻找getter方法时找不到对应的属性,...
<artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> <!-- MyBatis Plus Starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-...
"Android 兼容性问题:java.lang.UnsupportedOperationException解决办法" Android 兼容性问题:java.lang.UnsupportedOperationException解决办法是 Android 开发中常见的一种问题。该问题会导致应用程序崩溃,...
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解决办法 出现问题: 08-13 18:29:22.924: E/AndroidRuntime(1875): Caused by: Java.lang.ClassNotFoundException:XXXXX in loader dalvik.system....
ThreadLocal<String> threadLocal = new ThreadLocal<>(); ``` ##### T get() **用途**:返回当前线程所持有的 ThreadLocal 变量的副本。如果这是线程第一次访问,则会创建并初始化该副本。 **示例代码**: ```...
[CDATA[ select t.empcode,t.empname,t.birthday from emp t where t.empcode = #empCode# and t.sex = #sex# ]]> </select> ``` 2. **基本类型的result** - 当查询结果只需要一个基本类型的值(如整数)时,...
- `java.lang.Class<T>`:这个类是反射的入口,每个Java类和接口都对应一个`Class`对象。它提供了获取类信息、创建对象、访问字段和方法的接口。 - `java.lang.reflect.Field`:代表类的字段,用于获取和设置字段...
-keep class * extends java.lang.annotation.Annotation -keepclasseswithmembernames class * { native <methods>; } -keep class com.alipay.euler.andfix.** { *; } 2. 打补丁包,首先生成一...
例如,假设我们有一个泛型类 Pair<T>,其中的方法 setFirst(T first) 将被擦除为 setFirst(java.lang.Object first)。为了避免类型不匹配问题,编译器将生成一个桥接方法: ```java public void setFirst(java.lang...
- **使用Optional**:Java 8引入的`Optional<T>`可以帮助避免空指针异常,它提供了一种更安全的方式来封装可能为null的值。 - **避免返回null**:设计方法时尽量避免返回null,而应返回一个默认值或抛出异常。 ### ...
在Java中,反射机制是通过java.lang.Class类和java.lang.reflect包来实现的。本笔记将深入探讨Java反射的原理、用途以及如何使用。 一、反射的概念与作用 反射是Java提供的一种能力,它允许程序在运行时动态地获取...
<type>java.lang.String</type> </attribute> </tag> ``` 这里,`tag-class`指定的是处理这个标签的Java类,`body-content`指定了标签内容的处理方式,`attribute`定义了标签的属性。 接着,我们需要编写对应的...