public final?class Class<T> implements Serializable,?java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,java.lang.reflect.AnnotatedElement {
? ? private Class() {}
? ? public String toString() {
? ? ? ? return ( isInterface() ? "interface " :(isPrimitive() ? "" : "class "))?+ getName();
? ? ?}
}
? ? ? ? 这是Class class片段。注意它的private Class() {},意指不允许任何人经由编程方式产生Class object。是的,其object 只能由JVM 产生。
?
? ? ? ? JDK中提供的Reflection API,Java反射相关的API在包java.lang.reflect中,JDK 1.6.0的reflect包如下:
Member接口 | 该接口可以获取有关类成员(域或者方法)后者构造函数的信息。 |
AccessibleObject类 | 该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。 |
Array类 | 该类提供动态地生成和访问JAVA数组的方法。 |
Constructor类 | 提供一个类的构造函数的信息以及访问类的构造函数的接口。 |
Field类 | 提供一个类的域的信息以及访问类的域的接口。 |
Method类 | 提供一个类的方法的信息以及访问类的方法的接口。 |
Modifier类 | 提供了 static 方法和常量,对类和成员访问修饰符进行解码。 |
Proxy类 |
提供动态地生成代理类和类实例的静态方法。 |
?
? ? ? ? Java允许我们从多种管道为一个class生成对应的Class object。Java 允许多种管道生成Class object。整理如下:
? ? ? ? 1、Class object 诞生管道
? ? ? ? ? ? 1)运用getClass()。注:每个class 都有此函数
? ? ? ? ? ? ? ? ? ?String str = "abc";
? ? ? ? ? ? ? ? ? ? Class c1 = str.getClass();
? ? ? ? ? ? 2)运用Class.getSuperclass();
? ? ? ? ? ? ? ? ? ? Button b = new Button();
? ? ? ? ? ? ? ? ? ??Class c1 = b.getClass();
? ? ? ? ? ? ? ? ? ??Class c2 = c1.getSuperclass();
? ? ? ? ? ? ?3)运用static method?Class.forName()(最常被使用)
? ? ? ? ? ? ? ? ? ??Class c1 = Class.forName ("java.lang.String");
? ? ? ? ? ? ? ? ? ??Class c2 = Class.forName ("java.awt.Button");
? ? ? ? ? ? ? ? ? ??Class c3 = Class.forName ("java.util.LinkedList$Entry");
? ? ? ? ? ? ? ? ? ??Class c4 = Class.forName ("I");
? ? ? ? ? ? ? ? ? ??Class c5 = Class.forName (".class");
? ? ? ? ? ? ? 4)运用primitive wrapper classes的TYPE 语法
? ? ? ? ? ? ? ? ? ??Class c1 = Boolean.TYPE;
? ? ? ? ? ? ? ? ? ??Class c2 = Byte.TYPE;
? ? ? ? ? ? ? ? ? ??Class c3 = Character.TYPE;
? ? ? ? ? ? ? ? ? ??Class c4 = Short.TYPE;
? ? ? ? ? ? ? ? ? ??Class c5 = Integer.TYPE;
? ? ? ? ? ? ? ? ? ??Class c6 = Long.TYPE;
? ? ? ? ? ? ? ? ? ??Class c7 = Float.TYPE;
? ? ? ? ? ? ? ? ? ??Class c8 = Double.TYPE;
? ? ? ? ? ? ? ? ? ??Class c9 = Void.TYPE;
? ? ? ? ? ? ? ? ? ??请记住一句话,java中,一切皆对象。也就是说,基本类型int float 等也会在jvm的内存池像其他类型一样中生成
一个Class对象。而数组等组合型数据类型也是会生成一个Class对象的,而且更令人惊讶的是,java中数组的本来面目其实就是某个类,惊讶
中的惊讶是,含有相同元素的相同维数的数组还会共同享用同一个Class对象!其实根据我的臆想,数组的length性质应该就保存在这个Class
对象里面。
?
四、Class类中存在以下几个重要的方法:
? ? ?? ? 反射可以获取位置类的信息,并且能够使用其中的属性和方法。一句话,类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字。
? ? ? ? 首先得根据传入的类的全名来创建Class对象。
? ? ? ? Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;?
? ? ? ? Object obj=c.newInstance();//创建对象的实例?
? ?
1、获得构造函数的方法?
2、 获得类方法的方法?
3、获得类中属性的方法?
????
? ? 常用的就这些,知道这些,其他的都好办……?
比如:
1.getName()
? ? ? ? 一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象,调用该方法会产生奇怪的结果。
?
2.newInstance()
该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();
?
3.getClassLoader()
返回该Class对象对应的类的类加载器。
?
4.getComponentType()
该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:
int[] ints = new int[]{1,2,3};
Class class1 = ints.getClass();
Class class2 = class1.getComponentType();
而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象。
?
5.getSuperClass()
返回某子类所对应的直接父类所对应的Class对象。
?
6.isArray()
判定此Class对象所对应的是否是一个数组对象。
?
?
?
五、总结
? ? 最近,第一次面阿里,跪了。发现自身在这些基础知识,明显不扎实。所以,开始不断的补充,并复习以前的知识。愿不断进步。
原文:http://cyw.iteye.com/blog/2193389