一文带你理解java的反射机制

什么是反射?

反射是指在运行时对于任意类都能获得该类的所有方法和属性,并且可以调用该类的任意方法和属性,这种动态调用方法和属性的功能被称为java的反射机制。

如何理解反射?

对于初学者来说反射的定义可能不好理解,其实当我们理解了反射后我们可以用自己的方式去理解定义反射,本人理解反射就一个成语:庖丁解牛,
如果把牛看做一个对象,那么牛头,牛腿等等这些部位合起来就组成了一头完整的牛;我如果拿到了这些所有的部位了那我就能得到一头完整的牛,并且我就能调动牛所有的功能。 回过头再看java,java类在运行时都会被编译为.class文件,那么我如果拿到了某个类的class文件,那么我就能调用该类所有的方法以及属性。

示例

我们以下面的类作为示例:
Dog.java

  • 获取该类的Class对象

    获取一个类的Class对象有三种方式

    //1.通过Class.forName获取
    Class<?> aClass = Class.forName("com.dukang.reflect.entity.Dog");
    
    //2.通过类名获取
    Class<Dog> aClass1 = Dog.class;
    
    //3.通过对象获取
    Class<? extends Dog> aClass2 = new Dog().getClass();
    
  • 获取该类的对象

    获取类的对象有两种方式:

    //1.直接调用newInstance方法
    Object newInstance = aClass.newInstance();
    
    //2.根据构造方法获取对象
    Constructor<?> constructor = aClass.getConstructor(String.class, int.class);
    Object tom = constructor.newInstance("tom", 5);
    
  • 获取并调用该类的方法

    Method say = aClass.getMethod("say");
    say.invoke(newInstance);
    
    //根据方法名、参数获取对应的方法,与方法的修饰符无关
    Method eat = aClass.getDeclaredMethod("eat", String.class);
    eat.setAccessible(true);
    eat.invoke(newInstance,"bone");
    

    这里需要注意eat.setAccessible()方法,由于eat方法被private所修饰所以在调用时需要设置可访问参数为true,否则会出现异常:
    java.lang.IllegalAccessException

  • 获取类的属性

    //根据名称获取对应字段,只能是公共的
    Field name = aClass.getField("name");
    name.set(newInstance,"jack");
    Dog dog = (Dog) newInstance;
    System.out.println(dog.name);
    

如果要获取私有的字段可以使用aClass.getDeclaredField(),根据上面的经验如果要给字段设置值需要设置可访问参数为true。

总结

通过上面的例子我们可以总结下:我们拿到了某个类的Class对象,相当于我们拿到了这个类中的所有内容,既然我们拿到了所有的内容那我们就可以访问和调用该类的所有“内容”。

如果喜欢本文的话记得点一下"关注"支持一下
同时也欢迎大家转发,也可以关注作者的公众号,我们一起学习啊

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值