Java反射机制123

  • Java反射机制是在运行状态中,对于任意的一个类(class文件),都能知道这个类的所有属性和方法
  • 对于任意一个对象,都能调用它的任意一个方法和属性
  • 这种动态获取的信息以及动态调用对象的方法的功能称为Java反射机制,可以理解为对类的解剖
  • 要想对字节码文件进行解剖,必须要有字节码文件对象
  • 获取字节码文件对象的方式
    • 1、Object类中的getClass()方法,想要用这种方式,必须要明确具体的类,并创建对象
    • 2、任何数据类型都具备一个静态属性.class来获取对应的Class对象,这相对简单,但还是要明确用到类中的静态成员
      • 如已有Person类,则可以这样获取
      • Class clazz = Person.class;
    • 3、只要通过给定的类的字符串名称就可以获取该类,可以使用Class类中的方法完成,该方法就是forName()方法
      • 如已有Person类,所在包名为com.qsx,则可以这样获取
      • String className = "com.qsx.Person";
      • Class clazz = Class.forName(className); //拿到字节码文件并加载进内存
      • Object obj = clazz.newInstance(); //产生新实例对象
      • 这种方式只要有名称即可,更为方便,扩展性更强。
      • 通过构造函数进行初始化
        • Constructor constructor = clazz.getConstructor(String.class,int.class); //假设Person类有个带String类型和int类型的构造函数 ,这里可以获取到指定的构造函数对象
        • Object object = constructor.newInstance("小明",18); //通过构造对象的 的newInstance方法进行对象的初始化
      • 获取字节码文件中的字段
        • Field field = clazz.getField("age"); //Person类中含有名称为age的int 类型的字段,这只能拿public修饰的公有字段
        • Field field = clazz.getDeclareedField("age"); //这方法能拿Person类中所有的字段,包括公有的、私有的、受保护的等等
          • field.setAccessible(true); //对私有字段的访问取消权限检查
          • Object obj = clazz.newInstance();
          • field.set(obj,89); //设置值,相当于setAge()方法
          • Object o = field.get(obj); //取到值,相当于getAge()方法
      • 获取指定Class中的公共函数
        • Method[] methods = clazz.getMethod(); //获取到一个方法的数组,只能获取到共有的方法
        • method=clazz.getDeclaredMethods(); //能获取到本类中的所有方法,包含私有的,公有的,受保护的等
        • for(Method method:methods){
          • System.out.println(method); //循环遍历打印出来
        • }
        • Method method = clazz.getMethod("show",null); //获取空参数一般方法,show是Person中的空方法名,获取到一个方法
        • method.invoke(obj,null); //运行前面获取的show方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值