反射浅析

本文深入探讨了Java反射机制,介绍了如何获取Class对象,包括通过类名、类对象和对象实例的方法。接着讲解了Class对象的相关方法,如获取成员变量、构造器和方法,并展示了如何使用反射进行字段赋值、调用方法等操作。此外,还提供了一个框架级别的反射应用案例,演示了如何结合配置文件动态执行类的方法。
摘要由CSDN通过智能技术生成

获得Class对象方法

  • Class.forName("全类名")
    • Class cls = Class.forName("cn.itcast.domain.Person");
  • 类名.class
    • Class cls = Person.class;
  • 对象.getClass()
    • Person p = new Person(); Class cls = p.getClass();

所得Class是字节码文件

Class对象的相关方法

  • 获取成员变量
    • Field[] getFields() 只能获取public成员变量的一个数组

    • Field[] getDeclaredFields() 获取所有成员变量个一个数组

    • Field getField(String name) 只能获取public成员变量的一个Field对象

    • Field getDeclaredField(String name) 能获取所有类型的成员变量的一个Field对象

    • 获取Field对象之后的操作

    1. 设置值void set(Object obj, Object value)
    2. 获得值get(Object obj) obj是类对象
    3. 忽略访问修饰符的安全权限检查 setAccessible(true or false) 暴力反射
    • 代码
      ==首先获得class对象==
      (Person 是个类,里面有public成员变量a)
      Class cls = Person.class;
      ==然后获得Field对象==
      Field field = cls.getField("a");//field是一个Field对象
      ==创建Person对象然后获得value==
      Person p = new Person;//创建一个Person对象
      ==获得成员变量a的值==
      Object value = a.get(p);
      ==设置成员变量a的值==
       a.set(p,"张三");
      
  • 获取构造器
    • Constructor[] getConstructors()
    • Constructor getConstructor(类<?>...parameterType)
    • Constructor[] getDeclaredConstructors()
    • Constructor getDeclaredConstructor(类<?>...parameterType)
    • 获得Constructor对象后的操作
      • Object newInstance() 创建类对象
    • 获得构造器的目的创建类对象
    • 代码
      ==先获得class对象==
      Class cls = Person.class;
      ==获得构造器对象==
      Constructor constructor = cls.getConstructor(String.class,int.class);
      //getConstructor所获得的是类的某一个构造函数,所以要指定参数类型以指定
      ==创建类对象==
      Object personInstance = constructor.newInstance("张三",23);
      

如果是要使用类的无参构造方法,可以直接对Class对象使用newInstance(),不用再创建Constructor对象

  • 获取成员方法
    • Method[] getMethods();
    • Method getMethod(方法名,类<?> parameterType) 根据一个方法的名称和参数类型可以确定某个方法
    • Method[] getDeclaredMethods();
    • Method getDeclaredMethod(方法名,类<?>parameterType)
    • 获得Method对象之后的操作
      • 执行方法 invoke(Object obj)
      • 获得方法的名称 getName()
    • 代码
      ==Person类中有一个方法==
      void eat(String food){System.out.println("吃"+food);
      ==获取Class对象==
      Class cls = Person.class;
      ==获取Method对象==
      Method method = cls.getMethod("eat",String.class);
      ==获得一个类对象==//至于为什么每次都要获得一个类对象来运行是因为规定吧
      Person p = new Person();
      ==执行method==
      method.invoke(p);
      ==获得方法的名称==
      String methodName = method.getName();
      

反射案例(框架)

  • 反射的运行需要配置文件的协同
    • 首先书写pro.property配置文件
      className = 全类;
      classMethod = 方法名;
      
    • 加载以及使用
      ==创建Property对象(是Map的子类,内容为键值对,唯一与IO流有关的集合)==
      Property pro = new Property();
      ==使用Property的load方法加载配置文件之前需要找到配置文件路径==
      //获得当下Java文件的类加载器
      ClassLoader classLoader = 当前java类名.class.getClassLoader();
      //从类加载器获得配置文件的输入流
      InputStream is = classLoader.getResourceAsStream("配置文件名");
      ==使用Property的load方法加载配置文件==
      pro.load(is);  //现在pro里面装载了键值对
      ==获取pro里的键值信息然后使用==
      String className = pro.getProperty("className");
      String methodName = pro.getProperty("methodName");
      ==使用信息访问类并且运用类===
      Class cls = className.class;
      Method method = cls.getMethod(methodName);
      Object obj = cls.newInstance();  //无参构造
      method.invoke(obj);  //执行方法
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子陌.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值