一、反射
首先理解什么叫反射
日常生活中,白天的时候我们经常看到光啊啥的,但是你明明不看太阳,但是依然能够感受到光,这就是因为太阳光的反射现象(这是一种物理现象)。通过反射我们知道现在太阳在发光,发亮。通过这些光,我们能够找到源头,也就是太阳。
相同的,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了。
我们这一节简单的先说一下, 让大家有个概念,下一节继续讲述