1.反射的获取方式
1.1 通过类名.class获取反射对象
class cls = Object.class;
1.2 通过class.forName()获取反射对象
class cls = class.forName("class.path");
1.3 通过对象名.getClass()获取反射对象
class cls = object.getClass();
1.4 通过类加载器获取反射对象
ClassLoader classLoader = Practice0.class.getClassLoader();
Class s = classLoader.loadClass("全类名");
2.通过反射对象获取对象的方法以及属性
2.1 获取对象的单个方法
获取包括父类的public方法
Method method = cls.getMethod("方法名称");
获取不包括父类的public方法
Method method = cls.getDeclaredMethod("方法名称");
2.2 获取对象的所有方法
获取包括父类的public方法
Method[] methods = cls.getMethods();
获取不包括父类的public方法
Method[] methods = cls.getDeclaredMethods();
2.3 Method对象包含方法的所有属性
method.getName(); 返回方法名称
method.getReturnType(); 返回方法返回值类型,返回一个class实例,如:String.class
method.getParameterTypes(); 返回方法的参数类型,是一个class数组,如:{String.class,Integer.class}
method.getModifiers(); 返回方法的修饰符,是一个int数值,不同的bit表示不同含义
2.4 method对象小结
通过method实例可以调用某个对象的方法
Object invoke(Object instance, Object... parameters); 第一个参数是对象实例,第二个参数是方法参数
通过设置 method.setAccessible(true)访问非public方法
2.5 获取对象的单个属性
获取包括从父类继承的公共字段
Field field = cls.getField("字段名");
获取声明字段,包括私有属性,不包括从父类继承的
Field field = cls.getDeclaredField("字段名");
2.6 获取对象的所有属性
获取包括从父类继承的所有公共字段
Field[] fields = cls.getFields();
获取所有声明字段,包括私有属性,不包括从父类继承的
Field[] fields = cls.getDeclaredFields();
2.7 Field对象包含字段的所有属性
field.getName(); 返回字段名称 如 name
field.get(cls); 返回字段的值 如name的值是: 张三
field.getGenericType().getTypeName(); 获取对象属性的类型
field.setAccessible(true); 访问私有属性
field.set(cls,"李四"); 给获取的字段赋值
3.通过反射获取某个类的构造方法
3.1 获取单个构造方法
获取单个公有构造方法
Constructor con = cls.getConstructor(String.class); 参数是一个参数类型
获取无参构造方法
Constructor con = cls.getConstructor(null); 获取无参构造方法给null就行
获取单个任意修饰符的构造方法
Constructor con = cls.getDeclaredConstructor(String.class); 参数是一个参数类型
3.2 获取所有构造方法
获取所有公有构造方法
Constructor[] cons = cls.getConstructors();
获取所有任意修饰符构造方法
Constructor[] cons = cls.getDeclaredConstructors();
3.3 调用构造方法
con.setAccessible(true); 暴力破解访问私有构造方法
调用构造方法
Object obj = con.newInstance();
Object obj = con.newInstance("张三");
最后
反射多数用于框架中,项目中用到的情况可能会比较少,用到的时候可以看一看,希望对您有所帮助