优秀的编程知识分享平台

网站首页 > 技术文章 正文

反射的基石——Class类(一)(反射种类)

nanyue 2024-09-06 20:25:48 技术文章 5 ℃

小伙伴们今天分享的知识是反射,呢我们学反射之前,先来了解一下Class类。

Java类用于描述一类事务的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值,Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,呢这里大家要特别注意与小写的class关键字是不一样的,Class类描述了哪些方面的信息呢,类的名字,类的访问属性,类所属的包名,字段名称的列表,方法名称的列表,等等。所以呢,我们学习反射,首先就要明白Class这个类。

呢举个小例子,现在要定义一个Person对象,我们可以这样写

Person person1=new Person();呢Class cls1=xxxxxxxx;呢我们是通过怎么样的方式来给Class类型的cls1这个变量赋值呢?一定要弄一个Class的实例对象,可以new 吗,不可以,没有这样子弄的,在api中就没有这样new Class()的这种构造方法的。这个 Class的实例对象代表内存当中的一份字节码,也就是说Class cls1=字节码1;

呢现在我们说什么叫做字节码,当我们在源程序中用到Person的这个类的时候,首先要把这个类的编译之后的二进制代码加载到内存当中来,才可以用它去创建一个个的对象,当程序中用到了好多类,比如Date类,Math类,再加上Person 类,呢内存中就应该有3份字节码,呢每一份字节码就是一个Class的实例对象。譬如我们就可以这样子表示 Class cls1=Data.class;Data.class这个就表示Date这个类在内存中的字节码文件,因为一旦遇到Date这个类的名字,内存当中出现这个类的字节码,就会从硬盘上加载进来,呢这个字节码就是一个对象,对象的类型是什么呢,Class.呢我们说person1是什么呢,就是呢份字节码搞出来的对象,呢对象身上会有方法,那么有一个方法person1.getClass()就可以得到这份字节码。就是说我们拿到一个对象,调用它的getClass()方法,就可以得到这个类的字节码文件。

呢还有一种方式Class.forName("java.lang.String");也就是说Class类中有个静态方法forName,可以在这个方法中指定一个完整的类的名称,它也是可以得到这个类的字节码。注意,这里说的是得到这个类的字节码,得到这个类的字节码有两种。第一种:这个类的字节码已经加载到内存当中来了,现在需要得到这个字节码我们就不需要加载了,我直接找到呢份字节码返回回来就好了。还有一种就是我去得到这个类的字节码,可是虚拟机上海没有这份字节码,于是用类加载器去加载,加载进来之后缓存起来。同时,forName方法返回刚加载进来的字节码。

呢得到字节码的方式还有第三种,是一种固定的写法,就是类名.class,比如System.class。

呢我们在反射中应用时,主要用到第二种,因为在写源程序的时候还不知道类的名字。

好啦,宝宝们,今天的知识分享到这里,明天继续哈。喜欢的宝宝互粉哦~~~

最近发表
标签列表