简介
- 反射允许对成员变量, 成员方法和构造方法的信息进行编程访问
class对象(字节码对象)的获取
-
从Java文件 -> class文件 class文件加载到内存 创建对象 源代码阶段 加载阶段 运行阶段 - 获取的三种方法
Class.forName("全类名"); //方法一 类名.class //方法二 对象.getClass(); //方法三
- 示例
//总的来说是为了获得Student类的字节码对象,Student省略不写 //方法一示例,最为常用 Class classA = Class.forName("全类名"); //方法二示例,一般作为参数传递 Class classB = Student.class; //方法三示例,当已有类的对象时使用,应用范围小 Student s = new Student(); Class classC = s.getClass();
- 示例
构造方法的获取
- Class类中用于获取构造方法的方法
Constructor<?> getConstructors() //方法一,返回所有公共构造方法对象的数组 Constructor<?> getDeclaredConstructors() //方法二,返回所有构造方法对象的数组 Constructor<?> getConstructor(Class<?>... parameterTypes) //方法三,返回单个公共构造方法对象 Constructor<?> getDeclaredConstructor(Class<?>...parameterTypes)//方法四,返回单个构造方法对象
- 示例
//方法一 //1.获取字节码对象 Class classA = class.forName("全类名"); //2.获取构造方法 Constructor[] con1 = classA.getConstructors(); for(Constructor con : con1){ System.out.println(con); } //剩下三个示例依葫芦画瓢,不水了
- 示例
- Constructor类中用于创建对象的方法
T newInstance(Object...initargs) //根据指令的构造方法创建对象 setAccessible(boolean flag) //设置为true, 表示取消访问检查
- 示例
Class classA = class.forName("全类名"); Constructor con = classA.getDeclaredConstructor(构造方法对应的形参列表); con.setAccessible(true); //若对应构造方法受保护,就可通过这个方法,暴力反射 //假设创建一个Student的类的对象 Student student = (Student)con.newInstance(传对应构造方法的参数);
成员变量的获取
- Class类中用于获取成员变量的方法
Field[] getFields() //返回所有公共成员变量的对象的数组 Field[] getDeclaredFields() //返回所有成员变量的对象的数组 Field[] getField(String name) //返回单个公共成员变量的对象 Field[] getDeclaredField(String name) //返回单个成员变量的对象
- 示例
Class classA = Class.forName("全类名"); Field[] fields = classA.gerDeclaredfields(); for(Field field:fields){ System.out.println(field); } //一样,剩下三个示例依葫芦画瓢,不水了
- Field类中用于创建对象的方法
void set(Object obj, Object value) //赋值,参数一为对象名,参数二为修改的值 Object get(Object) //获取值
成员方法的获取
- Class类中用于获取成员方法的方法
Method[] getMethods() //返回所有公共成员方法的对象的数组, 包括继承的 Method[] getDeclaredMethods() //返回所有成员方法的对象的数组, 不包括继承的 Method[] getMethod(String name, Class<?>... parameterTypes) //返回单个公共成员方法的对象 Method[] getDeclaredMethod(String name, Class<?>... parameterTypes) //返回单个成员方法的对象
- Method类中用于创建对象的方法
Object invoke(Object obj, Object... args) //运行方法 //参数一, 用obj对象调用该方法 //参数二, 调用方法传递的参数(没有则空着) //参数三, 方法的返回值(没有则空着)
- 示例
//没动力了, 键盘都敲冒烟了,都一样,不水了 //同时笔者的Java之路就告一段落了,Java专栏结束了
- 示例