学习笔记—反射
反射的概念和作用
概念
动态获取信息以及动态调用对象方法的一种反射机制。可以在程序运行时动态的获取类的属性、方法和构造器。
作用
可以动态的创建对象,不需要导入类的所在包,只需要知道类的完整路径就可以知道该类中的所有信息。
反射获取类的三种方式
1、根据全限定路径获取
Class.forName("路径");
2、根据对象获取
对象名.getClass();
3、根据类名获取
类名.class;
注意:一个类只有一个类对象。
常用方法:
System.out.println("获取类对象的包名:" + c.getPackage()); System.out.println("获取类的修饰符:" + c.getModifiers()); System.out.println("获取类的名称(全限定):" + c.getName()); System.out.println("获取类的名称(类名):" + c.getSimpleName()); System.out.println("获取类的父类的类对象:" + c.getSuperclass());
反射操作属性
获取该类及其所有父类的所有公共字段
// 获取该类及其所有父类的所有公共字段 Field[] fields = c.getFields(); for(Field f : fields) { System.out.println("获取属性名:" + f.getName()); System.out.println("获取修饰符" + f.getModifiers()); System.out.println("获取类型" + f.getType()); //返回的是类型的Class对象 }
获取该类声明的所有字段
// 获取该类声明的所有字段 Field[] fieldall = c.getDeclaredFields(); for(Field f : fieldall) { System.out.println("获取属性名:" + f.getName()); System.out.println("获取修饰符" + f.getModifiers()); System.out.println("获取类型" + f.getType()); //返回的是类型的Class对象 }
获取指定字段
// 指定获取类及其父类的公共字段 Field field = c.getField("pname"); // 指定获取类的所有字段 Field field2 = c.getDeclaredField("snull"); // 指定获取父类声明字段 Field field3 = c.getSuperclass().getDeclaredField("pname");
操作类属性
// 操作静态属性 类属性对象.get(null) // 返回静态属性的值 类属性对象.set(null,"值") // 赋值 // 操作非静态属性 类属性对象.get(Object obj); 类属性对象.set(Object obj,"值");
反射操作方法
获取该类及其所有父类的所有公共方法
// 获取所有的公共方法(包括父类) Method[] methods = c.getMethods(); for(Method method:methods) { System.out.println(method.getName()); }
获取该类声明的所有方法
// 获取所有声明的方法(不包括父类) Method[] methodall= c.getDeclaredMethods(); for(Method method:methodall) { System.out.println(method.getName()); }
获取指定方法
// 获取指定的公共方法 getMethod(String name, Class ... cla); // 获取指定的方法 getDeclaredMethod(String name,Class ... cla); /** 参数 * String : name 表示方法名 * Class ... cla 表示方法接收的参数类型的类对象 * */