十六、反射

一、什么是反射

反射允许对封装类的字段,方法和构造方法的信息进行编程访问

 二、反射的使用流程

一、获取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();

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值