一、万事万物皆对象
在Java中类是java.lang.Class类的实例对象,
构造函数是java.lang.reflect.Constructor类的实例对象,
成员变量是java.lang.reflect.Field类的实例对象,
成员方法是java.lang.reflect.Method类的实例对象。
二、类
Class类的实例是正在运行的Java应用中所有的类和接口。
1、Class类
https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html
There is a class named Class.
Class类的实例是正在运行的Java应用程序中的所有类和接口。
声明一个String类型的变量foo。
String foo = new String("Hello");
2、获取Class对象
三种方式可以用来获取Class对象。
2.1 通过类的class属性
每个类都有一个隐藏的静态成员变量class
Class bar = String.class;
2.2 通过实例对象的getClass方法
String foo = new String("Hello");
Class classType = foo.getClass();
2.3 通过Class类的forName方法
在官方文档中,变量bar被称为String类的类类型(class type)。
3、通过类类型创建该类的实例对象
通过如下方式创建类的实例对象要求该类必须要有无参数的构造方法。
4、动态加载类
编译时加载类的行为属于静态加载类,运行时加载类的行为属于动态加载类。
Class.forName("类的全称");
不仅表示了类的类类型,还代表了动态加载类。
在应用时可以结合接口制定规范
动态加载类的好处是可以不用每次更改都重新编译主程序,像一些运行中升级的功能很多用的都是这种方式。
三、成员变量
成员变量是java.lang.reflect.Field类的实例。
https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html
正文获取所有public类型的成员变量
Field[] classType.getFields();
正文获取目标成员变量
Field classType.getField(String name);
获取java.lang.Math类的成员变量PI
正文获取成员变量的名字
String field.getName();
获取成员变量的class type
Class field.getType();
四、构造函数
构造函数是java.lang.reflect.Constructor类的实例。
https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html
1、构造函数重载
构造函数的重载指的是同一个类里具有多个构造函数,多个构造函数的形参列表不同。构造函数重载允许Java类里包含多个初始化逻辑,从而允许使用不同的构造函数来初始化java对象。
2、获取构造函数
获取所有的public类型的构造函数
Constructor[] classType.getConstructors();
获取java.lang.String类所有的public类型的构造函数
获取指定的构造函数
因为Java的构造函数支持重载,所以我们可以通过限定形参的类型来指定某一个构造函数。
Constructor getConstructor(Class... parameterTypes)
获取java.lang.String类只有一个形参,类型是java.lang.StringBuilder的构造函数
五、成员方法
成员方法是java.lang.reflect.Method类的实例对象。
https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html
1、成员方法重载
Java允许同一个类里定义多个同名方法,只要形式参数列表不同就行。如果同一个类中包含了两个或两个以上方法的方法名相同,但形参不同,则被称为方法重载。至于方法的其他部分,如方法返回值类型、修饰符等与方法重载没有任何关系。形参列表的不同包括:形参个数,形参类型。
2、获取成员方法
获取所有的成员方法
Method[] getDeclaredMethods()()
获取指定的成员方法
Method getMethod(String name, Class... parameterTypes)
java.lang.String类的indexOf方法有四个同名方法,我们通过class type来获取第三个。
获取方法名
String method.getName();
获取方法的返回值类型的class type
Class method.getReturnType();
3、调用成员方法
调用一个成员方法,注意需要指定一个该类的实例对象。
Object invoke(Object obj, Object... args)
调用java.lang.String类的indexOf(String str)方法
六、关系图
七、通过反射执行系统命令
方式一,将通过getRuntime方法获取的Runtime实例转为Runtime类型,然后调用Runtime对象的exec方法
((Runtime)Class.forName("java.lang.Runtime").getMethod("getRuntime").invoke(null)).exec("calc");
方式二,完全利用反射调用exec方法
Class.forName("java.lang.Runtime").getMethod("exec",String.class).invoke(Runtime.getRuntime(), "calc");