一、什么是反射
反射允许对封装类的字段,方法和构造方法的信息进行编程访问
二、反射的使用流程
一、获取class字节码对象
二、获取构造方法
三、获取成员变量
四、获取成员方法
三、获取class对象的方法
//获取class对象的三种方式
//1、Class.forName("全类名(包名加类名)") 源代码阶段
Class aClass = Class.forName("com.bdqn.entity.Person");
System.out.println(aClass);
//2、类名.class 加载阶段
Class personClass = Person.class;
System.out.println(personClass);
//3、对象.getClass(); 运行阶段
Person person=new Person();
Class aClass1 = person.getClass();
System.out.println(aClass1);
四、获取构造方法
获取构造方法有四种
//获取所有公共构造方法(私有的获取不到) Constructor<?>[] getConstrutors(); //获取所有的构造方法 Constructor<?>[] getDeclaredConstrutors(); //获取单个公共构造方法的对象 Constructor<?>[] getConstrutor(Class<?>……parameterTypes); //参数就是你想获取的构造方法的参数类型 //eg: Constructor constructor = aClass.getConstructor(String.class,int.class); //获取单个构造方法对象 Constructor<?>[] getDeclaredConstrutor(Class<?>……parameterTypes); //eg:Constructor constructor = aClass.getDeclaredConstructor(String.class,int.class);
Constructor类中用于创建对象的方法
T newInstance(Object^ initargs): 根据指定的构造方法创建对象
setAccessuble(boolean flag):设置为true,表示取消访问检查
这个方法是表示创建pravate修饰的构造方法时
eg:
//表示临时取消权限校验(暴力反射) declaredConstructor.setAccessible(true); Person person = (Person) declaredConstructor.newInstance("张三"); System.out.println(person);
五、获取成员变量
阿斯顿
Class类中用于获取成员变量的方法(四种)
Field[] getFields(): 返回所有公共成员变量对象的数组 Field[] getDeclaredFields(): 返回所有成员变量对象的数组 Field[] getField(String name): 返回单个公共成员变量对象 Field[] getDeclaredFields(String name): 返回单个成员变量对象 eg: Field name = class1.getField("name"); Field age = class1.getDeclaredField("age");
Field类中用于创建对象的方法
void set (Object obj,Object value):赋值
Object get(Object obj)获取值
//获取到权限修饰符 int modifiers = name.getModifiers(); System.out.println(modifiers); //获取到成员变量名 String name1 = name.getName(); System.out.println(name1); //获取数据类型 Class<?> type = name.getType(); System.out.println(type); //获取成员变量记录的值 Person person=new Person("张三",23); Object o = name.get(person); System.out.println(o); //修改对象里面记录的值 name.set(person,"李四"); System.out.println(person);
六、获取成员方法
Class类中用于获取成员方法的方法
Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的 Mechod[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的 Method[] getMethod(String name,Class<?>……parameterTypes):返回单个公共成员方法对象 Method[] getDeclaredMethod(String name,Class<?>……parameterTypes):返回单个成员方法对象 eg: Method eat = class1.getMethod("eat"); Method eat1 = class1.getMethod("eat",int.class);
Method类中用于创建对象的方法
Object invoke(Object obj,Object……args):运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)
//方法的运行 Person person=new Person(); //参数一: 表示方法的调用者 //参数二:表示在调用方法时候传递的实际参数 //返回值:方法的返回值(如果没有就不写) eat1.invoke(person,5);
其他
//获取方法的修饰符 int modifiers = class1.getModifiers(); System.out.println(modifiers==1?"public":"private"); //获取方法的名称 String name = eat.getName(); System.out.println(name); Method sleep = class1.getDeclaredMethod("sleep"); String name1 = sleep.getName(); System.out.println(name1); //获取方法的形式参数 Parameter[] parameters = eat1.getParameters(); for (Parameter parameter:parameters){ System.out.println(parameter); } //方法抛出的异常 Class<?>[] exceptionTypes = eat1.getExceptionTypes();