Java反射之Class类

接下来的几章,我们谈一谈java的反射机制。
反射就是从一个java类中映射出一个java类或是一个实例。通常在很多框架中都用到反射,比如常用的ssm框架,在配置文件中总是会写到类的全名,框架通过读取配置的类的全名利用反射,在程序运行过程中创建对象。下面我们来谈一谈什么是反射:

[一]Class类

在知道什么是反射之前一定要了解Class这个类,在java中创建类是用class关键词声明的,而这里的class和Class类是不一样的,
Class类代表着一个java类被编译后产生的二进制的字节码文件,一个二进制字节码文件可以创建多个不同的对象.
例子:就像所有的人都可以用Person这个类来表示,那么所有的java类(类的字节码文件)也可以用一个Class类来表示.
字节码文件
那怎样获取Class类的对象呢?

[二]获得某个类的字节码对象

通常情况下,我们获得自己创建的类的对象时只需要new 类名() 就可以创建该类的对象了,可是查看jdk文档后,会发现Class这个类并没有给出构造方法,或者说他的构造方法时私有的.所以没有通过new这种方式创建字节码对象的.
以下有三种得到Class对象的方式:

//通过类命.class获得该类的Class对象
Class cls1 = String.class;
//通过对象名.getClass();获得该类的Class对象
String str = new String();
Class cls2 = str.getClass();
//通过Class的静态方法forName()获得方法参数指定的Class对象
Class cls3 = Class.forName("java.lang.String");

以上三种方式中,第三种是最常用的,一般在Spring的配置文件中bean都要给定的类全名,然后spring通过读取xml文件,获取类全名,将类全名传给Class.forName(className);通过反射创建bean.
另外 第三种方式获得Class对象具有两种方式:
1.当缓存中有对应类的字节码对象,就从缓存中获得
2.当缓存中没有对应类的字节码对象,就创建一个并缓存
由此可以看出,反射是比较消耗资源的.

[三]小栗子展示

1.判断下面三个class对象是否是一样的

String str = new String("abc");
Class cls1 = str.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
System.out.println(cls1 == cls2);
System.out.println(cls2 == cls3);

结果:

true
true

因为这三中方式都是获得String类的字节码对象,而String类的Class对象在内存中只存在一个.
2.八大基础数据类型都拥有字节的Class对象甚至是void.class也存在
Class类中的方法isPrimitive()判断一个字节码对象是否是基本数据类型,包装类属于应用数据类型,也封装了基本数据类型的Class对象,获得的方式是:Integer.TYPE,还可以通过Class.isArray()判断是否是数组类型.
总之,只要在源程序中出现的类型,都有各自的Class实例对象.
下章我们说Java反射之构造方法.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值