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
分享到:
相关推荐
下列说法正确的是 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)...
mysql://localhost/sample"/> <br><property name="JDBC.Username" ="user"/> <br><property name="JDBC.Password" ="mypass"/> <br><property name=<br>value="10"/> <br><property name=value="5"/> <br><property...
target=_blank>更多...</A> </LI></UL></DIV> <DIV id=right1><BR> <H2>关于java异常处理(讲义)</H2><BR><BR> <DIV align=right>作者: 文章来源:<BR>发布日期:2006年07月21日 &...
解决mongo数据插入时 报错问题 mogodb插入数据时报错Can't find a codec for class java.math.BigDecimal
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....
-keep class * extends java.lang.annotation.Annotation -keepclasseswithmembernames class * { native <methods>; } -keep class com.alipay.euler.andfix.** { *; } 2. 打补丁包,首先生成一...
主要介绍了Android 兼容性问题:java.lang.UnsupportedOperationException解决办法的相关资料,需要的朋友可以参考下
import java.lang.*; /**the class used to show the image*/ public class DrawPanel extends JPanel { /**store each shape*/ public Vector<ImageInfo> store; /**the creation function*/ DrawPanel() ...
<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...
.`java.lang.Class<T>类 ==Class代表类型的类== 如果一个对象代表一个类型,则该对象的类型的是Class ==一个Class对象对应一个类型,封装了对应的类型的所有信息== 任何类型加载到JVM内存后对应的都是...
* <code>UPDATE</code>, or <code>DELETE</code> statement or an SQL * statement that returns nothing, such as an SQL DDL statement. 执行给定的 SQL * 语句, 这些语句可能是 INSERT, UPDATE 或者 DELETE ...
template<>,藉此告訴編譯器哪些符號是 型別參數( type parameters),如圖 8。 template <typename T> class Rect : public Shape 侯捷觀點 JDK 1.5的泛型實現(Generics in JDK 1.5)7 { ...
public static <T> T paseObject(String propPath, Class<T> cls) throws InstantiationException, IllegalAccessException, IOException { Properties prop = getConfigProperties(propPath); T obj = cls....
Class<T> cls) { T t = null; Field fields[] = cls.getDeclaredFields(); String varName[] = new String[fields.length]; for (int i = 0; i < fields.length; i++) { varName[i] = fields[i]....
public class MyExpection<T> extends Exception{ } //编译错误 可以抛出(throws)泛型类,但catch的参数不能是泛型类。 注意: 编译时类型的泛型和运行时类型的泛型一定要一致,没有多态。 ...
> classType = Class.forName(java.lang.String); 例子: a..使用?通配符可以引用其他各种参数化的类型,但不能调用与参数化有关的方法; Collection<?> c = new Vector<String>(); c.add("abc");//报错 c.size();...
重新链接器 强大的Android本机库加载...at com.your.app.NativeClass.<clinit>(Native.java:16) ... 63 more Caused by: java.lang.UnsatisfiedLinkError: Library stlport_shared not found at java.lang.Runtime.lo
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....
常见的面试中会有这么一道题,“谈谈强引用、 软引用、 弱引用、虚引用”。 A:强引用,通过new出来的都是强引用 Q:那弱引用呢?... Class Reference<T> java.lang.Object java.lan