目录

1.

一、反射概述

反射是由calss类对象开始的,从class对象中,我们可以获得有关该类的全部成员的完整列表,可以找出该类的所有类型(它实现的接口和扩展的类);并可以发现关于类自身的信息,诸如它所应用的修饰符(public、final,等等)或它所在的包。反射有时也被成为内省(introspection),这两个词汇都隐喻了“让类自我审视并提供自身的描述信息”。
java是一种静态语言,因为有了反射的存在,使得Java变为一种准动态语言。

二、Java反射机制提供的功能

1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.在运行时获取泛型信息
5.在运行时调用任意一个对象的成员变量和方法
6.在运行时处理注解
7.生成动态代理
········

三、Class类

对象照镜子(自省)后可以得到的信息:某个类的属性、方法和构造器、某个类到底实现了哪些接口,对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含了特定某个结构(class/interface/enum/annotation/primitive type/void/[])的有关信息
1.Class本身也是一个类
2.Class对象只能由系统建立
3.一个加载的类在JVM中只会有一个Class实例
4.一个Class对象对应的是一个加载到JVM中的一个.class文件
5.每个类的实例都会记得自己是由哪个Class实例对象生成
6.通过Class可以完整地得到一个类中所有被加载的结构
7.Class类对象是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的Class对象

四、获取Class类的实例

1.若已知具体的类,通过类的class属性获取,该方法最为安全可靠,程序性能最高。
以User类为例:
Class clazz = User.class
2.已知某个类的实例,调用该实例getClass()方法获取Class对象
以User类为例:
class clazz = person.getClass()
3.已知一个类的全类名,且在该类路径下,可通过Class类的静态方法forName()获取。可能抛出ClassNotFoundException。
以User类为例:
class clazz = Class.forName("com.demo.User")
4.内置基本数据类型可以直接用类名.Type
5.还可以用ClassLoader

五、哪些类可以有Class对象?

1.class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类
2.interface:接口
3.[]:数组
4.enum:枚举
5.annotation:注解@interface
6.primitive type:基本数据类型
7.void

六、有了Class对象能做什么?

1.创建类的对象:调用Class的newInstance()方法
(1)类必须有一个无参构造器
(2)类的构造器访问权限需要足够
2.难道没有无参构造就不能创建对象了吗?
只要在操作的时候明确调用类中的构造器,并将参数传递进去之后,才可以实例化操作


class c1 = Class.forName(com.demo.User);
User user = (User)c1.newInstance();
Method setName = c1.getDeclaredMethod("setName",String.class);
setName.invoke(user,"测试");
//可以正常给User类中的name属性复制
-------未完待续------------

且视他人之疑目如盏盏鬼火,大胆去走自己的夜路。