1、Class对象
java程序中的各个java类属于同一类事物,该类事物有什么属性,属性的值是多少,则有这个类的实例对象来确定,描述这类事物的java类就是Class,Class用于代表某一类的字节码。
Class类描述了哪些方面的信息呢?
我们知道一个类包括:类的名称,类的属性,类所属的包名,字段名称列表,方法列表等等。
每当编写并编译了一个新类,就会产生一个Class对象,在运行时,我们想生成这个类的对象时,运行这个程序的JVM首先检查这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。
一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。
在内存中的情况:
|
上图可以看到,一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示。这些对象显然具有相同的类型。
2、如何得到各个字节码对应的实例对象(Class类型):一般有以下三种方法
(1)类名.class, 例如Person.class (2)对象.getClass(),例如:new Person.getClass() (3)Class.forName(“类名”);例如:Class.forName(“com.heima.Person”); |
例:
package com.heima.reflect; public class ReflectDemo1 { /** * @param args */ public static void main(String[] args) { String str="reflect";//定义一个字符串 Class cl1=str.getClass();//利用对象.getClass()获取 Class cl2=String.class;//利用类.class()获取 Class cl3=null;//利用Class.forName("完整类名");获取 try { cl3=Class.forName("java.lang.String"); } catch (ClassNotFoundException e) { e.printStackTrace(); } //判断在内存中是否只用一个Class System.out.println(cl1==cl2); System.out.println(cl1==cl3); } } |
运行结果:true,true
从结果上可以看出,在内存中,每一类都只用一个字节码。
3.九个预定义的Class对象
(1)int.classl=Integer.TYPE (2)boolean.class=Boolean.TYPE (3)byte.class=Byte.TYPE (4)char.class=Character.TYPE (5)short.class=Short.TYPE (6)long.class=Long.TYPE (7)float.class=Float.TYPE (8)double.class=Double.TYPE (9)void.class=Void.TYPE |
例:判断一个数据类型是否是基本的数据类型
Class类中提供了一个判断是否是基本类型的方法:
public boolean isPrimitive():判断指定的Class对象是否是基本数据类型 |
package com.itheima.reflect; public class ReflectDemo1 { public static void main(String[] args) { System.out.println(int.class.isPrimitive());//判断int是否是基本类型 System.out.println(Integer.class.isPrimitive());//判断int的包装类Integer是否是基本类型 System.out.println(String.class.isPrimitive());//判断String是否是基本类型 } } |
运行结果如下:
怎样判断数组类型的Class实例对象
Class类中提供了一个方法:
public boolean isArray():判断此Class对象是否表示一个数组类 |
package com.itheima.reflect; public class ReflectDemo1 { public static void main(String[] args) { System.out.println(int[].class.isArray());//判断int[]是否表示一个数组类 System.out.println(int.class.isArray());//判断int是否表示一个数组类 } } |
运行结果如下:
总之:只要在程序中类型,都有各自的Class对象