在java中可以用类来表示具有共性的一类事物,如我们可以用Person类来表示众多的人,同样的问题是我们用什么类来表示众多的java类呢?实际上,在Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
java.lang.Class 是一个比较特殊的类,它用于封装已经被加载到JVM中的类(包括类和接口)的信息。即当一个类或接口被装入JVM时便会产生一个与之关联的java.lang.Class对象可以通过这个Class对象来对类的详细信息进行访问。
Person类代表人,它的实例可以是张三、李四这样一个个具体的人,那么Class类代表Java类,它的实例对象表示什么呢?
---->Class的实例对象代表的是对应的各个类在内存中的字节码,例如:Person类的字节码,String类的字节码...
---->一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类有不同的字节码。
同样的,和普通类一样,Class类也描述了一些信息,如:类的名字,类的访问属性,类所属包的名字,字段名的列表,方法名的列表,等等....
如何得到字节码对应的实例对象呢?(Class类型)
1: 类名.class 例如::String.class 【返回String类对应的字节码】
2:对象.getClass() 例如:new Date().getClass() 【返回Date类对应的字节码】
3:Class.forName("类全名"); 例如:Class.forName("java.util.Date"); 【返回Date对应的字节码,这个方法常用】
实例代码:
public class ReflectTest1 {
public static void main(String[] args) throws ClassNotFoundException {
String str = "廖泽民";
/*对象.getClass()获取类的字节码*/
Class clas1 = str.getClass();
/*类.class获取类的字节码*/
Class clas2 = String.class;
/*Class.forName("类名");获取类的字节码*/
Class clas3 = Class.forName("java.lang.String");
/*判断这三份字节码是否相同--->结果为true*/
System.out.println(clas1 == clas2);
/*--->结果为true*/
System.out.println(clas2 == clas3);
/*判断是否属于原生态类型【基本类型】字节码--->结果为false*/
System.out.println(clas1.isPrimitive());
/*判断int类型和Integer类型的字节码是否相同--->结果为false*/
System.out.println(int.class == Integer.class);
/*Integer.TYPE获取的是Integer对应的基本类型--->结果为true*/
System.out.println(int.class == Integer.TYPE);
}
}
九个预定义的Class实例对象:
boolean.class
byte.class
char.class
short.class
int.class
long.class
float.class
double.class
void.class
注:只要是在源程序中出现的类型,都有各自的Class实例对象,例如:int[](数组类型不是基本类型),void....