Java学习里程-----Java基础_24 Java 反射机制(上)

一、反射

首先理解什么叫反射

日常生活中,白天的时候我们经常看到光啊啥的,但是你明明不看太阳,但是依然能够感受到光,这就是因为太阳光的反射现象(这是一种物理现象)。通过反射我们知道现在太阳在发光,发亮。通过这些光,我们能够找到源头,也就是太阳。

相同的,Java中也可以使用包名 + 类名直接可以定位到一个类,而且是唯一的一个类,我们呢,就可以知道这个类的一切。

二、反射机制

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。 --------来源于《百度百科》

这就说明,有了反射的语言,都很强大,也正是因为这个反射机制,才会有我们以后才会学习到的框架,例如Sprint、Mybatis等等。这些框架都是利用了Java的反射机制,如果没有反射机制,这些个框架根本不可能会存在。

三、Class

我们是通过java.lang包下面的Class这个去实现反射的。而且,这个是整个反射的核心,一定要好好学习。

下面呢,我们来学习一下反射这个东西。

四、使用

我们新创建一个类,我们叫ClassTest,我们叫这个东西,千万别就叫个Class,虽然可以创建,但我怕你自己搞搞搞的弄混了。

这里呢,我们再使用一下另外一个东西,内部类,这个东西我前面说过啊,大家可以去翻着看看。《Java学习里程-----Java基础_22 Java内部类》

我们创建一个包子类。(吃得内个包子,肉包子,素包子等等)

然后我们给包子一点属性,比如说馅料,价格。

再添加上get、set方法。这里有快捷键,要学习使用。alt + shift + s,这里要说一下,要光标在包子这个内部类里面啊,别把光标移到别的地方

看我的光标在哪里,然后

然后定义一个方法,say方法,输出我是什么馅的包子,多少钱。

看清楚 + 号的位置,初学者很容易弄混。

然后我们再主函数中实例化一下包子。

我相信肯定有人就这么去实例化了。

这里出现错误了,不要慌,我们来看一下错误的提示信息。

这个英文说得意思是,这个包子这个内部类,想要实例化必须得是用一个ClassTest类型的类进行进实例化,而且,这个不是还有一个eg吗,他是x.new A(),所以这里我们需要写成这样的

然后,我们输出一下bun的类的完整包路径

我们发现啊,输出是输出了,但是呢,这样实例化类太费劲了,而且我们平时开发也不会这么玩内部类的,这样做是比较繁琐了,我们一般这么去定义内部类,用一下static。so,我们修改一下代码

所以,大家要记住这样的方式,因为以后开发经常会用到。

我们继续讲,这里的.getClass()这个方法呢,我们看一下源码,按住ctrl + 鼠标左键,点进去。

很好啊,看不懂,不过不要紧,我们用一下翻译

我来解释一下,这个呢,是调用的Object类中的方法,可以获取到当前的这个对象。

 

后面的.getName()是做什么的呢?同样,我们来看一下源码。

这个我能看懂点,看这个方法最上面的一句话: Returns the  name of the entity,返回当前实体的路径,我不知道为啥叫个Name,但是这个就是完整的包路径。

然后往下看,下面还有一个例子。

是吧,一目了然。

 

整体解释:通过刚刚获取到对象,然后呢,再获取到当前对象完整的路径。这就是getClass.getName() 这两个方法。

 

PS:大家在学习的过程中,要多看这些个源码,刚开始看不要怕看不懂,但是一定要看,看的多了,你自然就知道如何去学习了,当你老板、或者你们部门经理、技术给你一个新的技术让你去研究的时候,你就会明白平时这样的积累有多重要了。

还有就是要好好学习英语,虽然说我们有翻译工具,但是,没有网的时候,我看你用什么玩意翻译。

五、反射找到对应的类,并输出包路径

我们既然知道了包的路径,我说过,Java的反射机制可以通过这个路径找到对应的类,下面我们来实践一下。

我们保存一份刚刚的这个类的路径  com.java.test.ClassTest$Bun ,然后我们通过这个类来反射去找到他。

我们统一都使用Class.forName()这个方法去找类,别的方法有没有我不知道,但是这个是常用的。我们看一下源码

然后得到了一Class<?> 这么的一个东西,这个还牵扯到泛型。大家不知道泛型的可以去我的博客中找一下。

这里的这个className就是我们刚刚输出的内个包路径。

这里这样的,为啥要写成java.lang.Class,我怕有的人不知道这个Class是那里的,所以我不导入包了,直接给他写上去。

我们获取到这个class1这个对象之后,我们输出一下它的包路径

我们会发现,是一样的。这里肯定有人会问了,为啥不再.getClass了。很简单,因为它已经是Class了。

我们这一节简单的先说一下, 让大家有个概念,下一节继续讲述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他 他 = new 他()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值