学习笔记—反射
程序员文章站
2022-04-09 19:02:15
反射的概念和作用 概念 动态获取信息以及动态调用对象方法的一种反射机制。可以在程序运行时动态的获取类的属性、方法和构造器。 作用 可以动态的创建对象,不需要导入类的所在包,只需要知道类的完整路径就可以知道该类中的所有信息。 反射获取类的三种方式 1、根据全限定路径获取 2、根据对象获取 3、根据类名 ......
反射的概念和作用
概念
动态获取信息以及动态调用对象方法的一种反射机制。可以在程序运行时动态的获取类的属性、方法和构造器。
作用
可以动态的创建对象,不需要导入类的所在包,只需要知道类的完整路径就可以知道该类中的所有信息。
反射获取类的三种方式
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 表示方法接收的参数类型的类对象 * */