天天看点

Java反射之Class类

在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....