java反射之Class类

 

1Class对象

java程序中的各个java类属于同一类事物,该类事物有什么属性,属性的值是多少,则有这个类的实例对象来确定,描述这类事物的java类就是ClassClass用于代表某一类的字节码。

  Class类描述了哪些方面的信息呢?

   我们知道一个类包括:类的名称,类的属性,类所属的包名,字段名称列表,方法列表等等。

  每当编写并编译了一个新类,就会产生一个Class对象,在运行时,我们想生成这个类的对象时,运行这个程序的JVM首先检查这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。

  一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

在内存中的情况:

  上图可以看到,一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示。这些对象显然具有相同的类型。

2、如何得到各个字节码对应的实例对象(Class类型):一般有以下三种方法

1)类名.class, 例如Person.class

2)对象.getClass(),例如:new Person.getClass()

3Class.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对象

1int.classl=Integer.TYPE

2boolean.class=Boolean.TYPE

3byte.class=Byte.TYPE

4char.class=Character.TYPE

5short.class=Short.TYPE

6long.class=Long.TYPE

7float.class=Float.TYPE

8double.class=Double.TYPE

9void.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对象

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值