反射:
一:理解class
① Class是用来描述类的类。
比喻为"对象照镜子",可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
– Class 对象只能由系统建立对象。
– 一个类在 JVM 中只会有一个Class实例。
– 每个类的实例都会记得自己是由哪个 Class 实例所生成。
② Class这个类封装了什么信息?
Class是一个类,封装了当前对象所对应的类的信息,一个类中有属性,方法,构造器等,比如说有一个Person类,一个Order类,一个Book类,这些都是不同的类,现在需要一个类,用来描述类,这就是Class,它应该有类名,属性,方法,构造器等。
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class 对象只能由系统建立对象,一个类(而不是一个对象)在 JVM 中只会有一个Class实例。
解读文章:
https://www.cnblogs.com/flyme/p/4571030.html
https://www.cnblogs.com/tech-bird/p/3525336.html
:
那么问题:我们最常用的,new 类名() 和 类名.class的区别?
new xxx();是用来新建一个xxx类的实例
xxx.class返回的是描述“xxx类”的类(Class)的一个对象
class对象不是实例化对象,但是可以通过class对象获得实例化对象:
第一步:获得class对象
1.通过类名获取 类名.class
2.通过对象获取 对象名.getClass()
3.通过全类名获取 Class.forName(全类名)
第二步:通过class对象获得实例化对象
.newInstance()
例如:
//1.获取Class对象
String className="com.atguigu.java.fanshe.Person";
Class clazz = Class.forName(className);
//利用Class对象的newInstance方法创建一个类的实例
Object obj = clazz.newInstance();
(jvm会给每一个类,创建一个描述这个类的类,这个class类我们看不到,是在运行时创建的,拿到这个class类的对象,就可以操作这个class类的内部信息:
例如:
public class DemoTest{}
public final class Class<DemoTest>{}
DemoTest.class = 类 = 设计图
new DemoTest() = 建立物件 = 从设计图中弄一件实在的东西出来
Class c = DemoTest.class; c可以理解为类对象(模板)
DemoTest c1 = c.newInstance(); c1可以裂解为实例化对象(通过模板创造出来的实实在在的物体)
DemoTest t= new DemoTest(); t可以理解为实例化对象(通过模板创造出来的实实在在的物体)
(第三种方式的底层好像就是第二种)
)
二反射
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
Java反射机制主要提供了以下功能:
- 在运行时构造任意一个类的对象
- 在运行时获取任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法(属性)
- 生成动态代理