反射总结

*******reflect******************
概念:反射机制指的是程序在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法


一.获取一个class对象

获取字节码文件对象的三种方式:


1,object.getclass方法
代码: Student s=new Student();
Class<?> c=s.getClass();

需要创建类的对象,再由对象获取

2********通过数据类型的静态属性 class属性
代码: Class<?> c1 = Student.class;
System.out.println(c1);

通过类名获取

3*******Class类中一个静态方法
Class<?> c2=Class.forName("com.sxt.refiectDemo.Student");
System.out.println(c2);

方式三的好处: 因为传入的是一个字符串,而这个字符串可以通过配置文件配置
满足了设计原则: 开闭原则 对扩展开放,对修改关闭


二**********获取构造方法
1.Constructor<?>[] con = c.getConstructors();
获取所有的公有构造方法 数组
2,Constructor<?>[] getDeclaredConstructors()
获取所有的构造方法 数组
3,Constructor<?> con2=c.getConstructor (String.class,int.class);
获取单个公有的构造方法
4,Constructor<?> con3=c.getDeclaredConstructor(String.class,int.class);
获取单个的所有构造方法,包含私有
********************************************

通过反射获取构造方法对象并且创建对象
步骤:

1,获取字节码文件对象
2,通过字节码文件对象获取构造方法
3,通过构造方法去创建一个对象

con3.setAccessible(true);
暴力访问,可以通过私有构造方法创建对象

Object obj=constructor.newInstance();

注意:一个私有构造方法可以通过throw new error
("禁止访问该构造方法")来防止通过反射访问该构造方法
*********************************


三**********获取成员变量
1,Field[] f=c.getFields();
获取公有成员变量数组,包含其父类的公有成员变量

2,Field [] f1=c.getDeclaredFields();
获取所有的成员变量数组,本类,不包含父类

3,Field f3=c.getField("name");
获取单个公有成员变量 或者父类

4Field f4=c.getDeclaredField("age");
获取单个任意成员变量 本类,不包含父类

通过构造方法创建对象,通过成员变量来设置对象的属性
对于私有成员变量:
f4.setAccessible(true);可暴力设置
f4.set(obj, "张三");

四*********获取成员方法
1,Method[] methods = c.getMethods();
获取所有的公有成员方法数组,包含父类

2,Method[] declaredMethods = c.getDeclaredMethods();
获取所有的成员方法数组,包含私有

3,Method method = c.getDeclaredMethod("show")
// 获取所有单个的成员方法,包含私有
获取无参方法show
method.invoke(obj);
并且调用

五,使用反射创建数组
bject obj = Array.newInstance(String.class, 3);
创建一个具有指定的组件类型和长度的新数组。

Array.set(obj, 0, "张三");
通过反射给数组添加元素

原文地址:https://www.cnblogs.com/zzjlxy-225223/p/10732112.html