Java反射的使用

反射是Java框架的核心,无论是Tomcat,SpringMVC,SpringIOC,SpringAOP,动态代理,都使用了反射

那么什么是反射?-------------反射就是获取类信息的能力

Java有两种创建对象的方式:①new 对象  ②反射

因此,反射的作用就是,无需new对象,就可以动态获取到一个类的全部信息,包括属性,方法,构造器,以及他们的修饰符,参数,注解等等....从而构造出对象实例并对对象实例进行操作

一、获取类信息

1、获取class对象

  • Class.forName("全类名") ----- 在 java文件阶段 就可以获取 字节码文件对象,因此这是最常用的(这种是最常用的)
  • 类名.class ------ 要在类加载完成阶段才能获取
  • 对象名.getClass() -------- 要在对象已经被创建出来的阶段才能获取
        //第一种
        Class clazz = Class.forName("fanshe.person");
        //第二种
        Class clazz1 = person.class;
        //第三种
        person person = new person();
        Class clazz2 = person.getClass();
        

2、获取变量

Filed[] fileds = clazz.getDeclaredFileds();  //获取全部的变量
Filed[] fileds = clazz.getFileds();  //获取public修饰的变量
Filed filed = clazz.getFiled("变量名"); //获取指定的public修饰的变量
Filed filed = clazz.getDeclaredFiled(变量名"); //获取指定的的变量

3、获取方法

Method[ ] methods = clazz.getDeclaredMethods(); //获取全部的方法
Method[ ] methods = clazz.getMethods();  //获取全部public修饰的方法
Method method = clazz.getMethod("方法名",参数类型.class,参数类型.class...; //单独获取public修饰的方法
Method method = clazz.getDeclaredMethod("方法名",参数类型.class,参数类型.class...); //单独获取方法

4、获取构造器

Constructor[] constructors = clazz.getDeclaredConstructors(); //获取所有的构造器
Constructor[] constructors = clazz.getConstructors(); //获取public修饰的构造器
Constructor constructor = clazz.getConstructor(参数类型.class,参数类型.class..; //单独获取public修饰的构造器
Constructor constructor = clazz.getDeclaredConstructor(参数类型.class ,参数类型.class….;//单独获取构造器

5、获取注解信息

 Annotation[] annotations = clazz.getAnnotations();

二、如何操作变量

下面看一段代码示例

        Class clazz = Class.forName("fanshe.person");
        System.out.println("----------获取 修改值--------------");
        //要想获取到值,必须先创建对象,给数据存储空间
        person p = new person(); 
        Field age = clazz.getDeclaredField("age");
        //get() set()取值和赋值
        int ageValue = (int) age.get(p);//类型转换
        System.out.println(ageValue);
        age.set(p, 20);
        int ageValue1 = (int) age.get(p);
        System.out.println(ageValue1);
        
        Field height = clazz.getDeclaredField("height");
        //私有数据需要使用暴力反射
        height.setAccessible(true);//暴力反射
        height.set(p, 180);
        System.out.println(height.get(p));
        
        //只有private类型需要使用暴力反射
        Field name = clazz.getDeclaredField("name");
        name.set(p, "张三");
        System.out.println(name.get(p));
        
        Field eyes = clazz.getDeclaredField("eyes");
        eyes.set(p, 2);
        System.out.println(eyes.get(p));

需要注意的是,

如果该属性或方法类型为private,那么需要使用暴力反射,也就是 属性.setAccessible(true)

如果要获取private类型的方法,那么需要使用getDeclared*****

三、调用方法

方法.invoke(对象,"参数");

        clazz = Class.forName("fanshe.person");
        Method run = clazz.getDeclaredMethod("run", String.class);
        //创建对象,给方法以内存空间
        person p1 = new person();
        //invoke()执行方法
        run.invoke(p1, "张三");
        Method change = clazz.getDeclaredMethod("change",String.class,Integer.class);
        change.invoke(p1,"小白",183);
        
        Method age = clazz.getDeclaredMethod("getAge", Integer.class);
        //暴力反射
        age.setAccessible(true);
        age.invoke(p1, 18);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值