小知识点:键盘上按住
Alt
可以实现纵向选中(可用在复制上面)
如图:
文章目录
反射概述
静态VS动态语言
动态语言:
是一类在运行的时候可以改变其结构的语言:如新的函数或者对象或者代码可以被引进,已有的函数可以被删除或者是其他结构上的变化。就是说在运行时的代码可以根据某些条件改变自身结构。
主要的动态语言:
如:Object-c、c#、JavaScript、PHP、Python
如:
这里的x可以因为eval()函数的加持而在运行的时候由字符串变成一个特定的整形值
静态语言:
运行时机构不可变的语言就是静态语言。
如:Java、C、C++
但是!!!
因为Java中有反射,所以Java可以有一定的动态性,所以Java被称为准动态语言,
反射
PPT截图,笔记记录
即通过一个Class类型的对象来得到一个类的所有信息,每个类都可以有一个Class类型的对象,他记录着这个类的所有信息
通过反射,甚至能得到类的父类的Class实例
简单来说,就是逆流而上,一般的都是从上到下,而反射可以从下到上
获得反射对象
Java反射机制提供的功能
反射常用的API
反射的优点和缺点
优点:
可以实现动态创建对象和编译,体现出很大的灵活性
缺点:
对性能有影响。使用反射基本上是一种解释操作,我们告诉JVM,我们希望做什么并且它满足我们的需求。这类操作总是慢于直接执行相同的操作。
获得反射对象
因为反射需要通过Class的对象来进行,所以我们需要获取到Class对象的实例,在Object类中有一个getClass的方法可以获得这个对象。所以当我们创建的类加载完成之后,在堆内存方法区中就会产生一个class类型的对象,我们需要的就是获得这个对象
可以通过Class 名=Class.forName("类路径");
来获取到指定类的Class对象
如:创建的这个User类就位于com.one.Spring5.Reflection.User
中
但是因为可能我们传入的类路径无效,所以需要抛出异常,如上
获取到的东西本质上就是这么个:但是并不是User的实例
一个类只会有一个Class对象:
可以看到,多个同一个类的Class的对象,其hashCode是相同的
在Object中定义了Public final Class getClass()
方法,此方法将被所有的子类继承
这个方法返回值就是一个Class类,此类是Java反射的源头,所以说,反射也可以这样解释:
可以通过对象反射求出类名的名称
得到Class类的几种方式
Class类的一些特性
Class类的一些常用方法
获取Class类实例的三种方法
- 若已知具体的类,则可通过类的Class属性获取到
此方法最为安全可靠,程序性能最高
如图:直接Class 名=类名.class
就可得到
注意这里前面的Class首字母大写,后面的是小写 - 已知某个类的实例,则可调用该实例的getClass()方法获取Class对象
如图: - 知道全类名通过Class类的静态方法forName()获取,此方法可能抛出ClassNotFoundException异常
此方法就是我们一开始用的那个方法
即:
获得基本内置函数的Class实例
获得内置类型的Class类也可用类名.class
如:Integer
如图:
这里得到了Integer
类的Class实例
通过Class实例,获取当前类的父类Class的实例
通过子类Class实例的getSuperclass()
可获得父类的Class实例
如图: