一、Java-Reflect主题
1 .类1 .使用类
2 .方法反射
3 .成员变量反射
4 .构造函数的反射
5.Java类加载机制
|------------基本反射轮廓
JAVA反射机制在执行状态下,对于任一类都可以知道该类的所有属性和方法; 对于其中一个对象
它可以调用任何方法和属性; 动态获取这些信息并动态调用对象方法的功能称为java语言反射机制。
运行Javareflection(radial )机制: )程序时,可以改变程序的结构和变量类型。 把这样的语言
PythonRuby是动态语言,而c、Java和C#不是动态语言。 但是,JAVA有非常突出的动态相关机制:Reflection
Java是指在编译期间可以在运行时加载、探测和使用完全未知的classes。 也就是说,Java程序
在运行时加载第一个知道名称的类,知道其完整结构,不包含methods定义,生成目标实体或生成其fields
设定值或唤起methods。
|--------------用于获得方法信息的函数------------------------------------------------- -。
方法获取方法(字符串名称,class[]params"--使用特定的参数类型获取命名的公共方法
Method[] getMethods ()--获取类的所有公共方法
methodgetdeclaredmethod (字符串名称,Class[] params ) -如何使用特写参数类型获取类声明的命名
method[]getdeclaredmethods(--获取类自己声明的所有方法,无论其权限如何
|-----------------用于获取用于获取成员的变量
Field[] getFields ()--方法获取所有公共成员变量的信息
Field[] getDeclaredFields ()--获取该类自己声明的成员变量的信息
字段设置(字符串名称)--获取命名的公共字段
fieldgetdeclaredfield (字符串名称)--用于获取类声明命名的字段
|------------用于获取构造函数的信息---------------------------------------------。
构造函数[ ]获取构造函数()--获取所有公共的构造函数
constructor [ ] getdeclaredconstructors (-建议使用自己声明的构造函数,而不考虑访问级别
结构控制器(class [ ] params )--获取使用特殊参数类型的公共
constructorgetdeclaredconstructor [ class [ ] params ]--获取使用特定参数类型的构造函数,而不管访问级别如何
=====================================
什么是Calss类
1 )在面向对象的世界里,万物都是对象
在Java语言中,静态成员,通常的数据类型是对象实际的吗?
班里是谁的对象?
类是对象,类是Java.lang.Class类的实例对象。
2 )这个对象应该怎么表达呢?
There is a Class named Class中文表显示,现在有一个班,他的名字叫class
大板栗直接分析:
2 .动态加载类
1.Class.forName (班级全名);
2 .不仅表示类的类类型,还表示动态加载类
3 .请区分编译、执行
4 .编译时加载类为静态加载类,运行时加载类为动态加载类
以前的小栗子:
主要:
Word类
分析:在上述main中,创建了两个类的实例。 假设现在还没有Word类
:我们去运行肯定会有四个错误:找不到两个类和两个类的方法。
那么我现在去创建一个Word类,就是上述的Word类。在运行的会怎样那。
运行结果两个错,找不到Office类和方法。
现在可以看出来一个问题:就是我有Word类,但是程序还不能运行。导致我不能使用任何一个类。
这就是静态加载类:在编译时刻就需要加载所有的可能使用到的类。
那么有什么办法能做到:我想用那个类的时候在告诉我,那个类能用,还是不能用。
解决方案:静态加载类
看栗子:
首先定义一个:动态加载类----》定义两个功能类------》定义一个功能标准接口分别让两个类实现。
动态加载类:
定义一个标准接口:
定义两个类实现标准接口:方便动态加载
3.java获取方法信息
基本的数据类型:
例如:
Class c1=int.class; //int的类类型 || Class c2=String.class; //String类的类类型
Class c3=double.class; || Class c4=Double.class; 两者不同,后表示Double类的类类型
Class c5=void.class;
void关键字 都存在类类型
3-1:Class类的基本API操作
打印类的信息,包括类的成员函数、成员变量
运行结果:
4:java获取成员变量构造函数信息
成员变量也是对象:java.lang.reflect.Field
Field类封装了关于成员变量的操作
4-1:获取成员变量:
运行如下:
4-1:获取构造函数信息
运行如下:
五:java方法反射的基本操作
1)如何获取某个方法
方法的名称和方法的参数列表才能唯一决定某个方法
2)方法反射的操作
methood.invoke(对象,参数列表)
小栗子:
7.泛型集合反射
1.看这样一个问题:
假设我定义一个泛型集合:
ArrayList list = new ArrayList();
添加一个信息:
list.add("a");
2.如果向这个集合添加一个数值可以添加吗?正常情况下肯定不行。
那么有什么办法可以实现添加那?答使用集合反射
集合反射又是什么鬼那?
集合反射就是,等待集合编译完成后,在进行集合操作,就是绕过编译期间。
接下来我们来看个,大栗子,你就懂了