首页 > 其他 > 详细

反射的方法

时间:2021-04-05 00:42:15      阅读:23      评论:0      收藏:0      [点我收藏+]

反射的一些方法

  1. 获取类的信息

    • Class.forName("类路径");
    • 对象.class();
    • 对象名.getClass();
  2. 必须实例化类的信息

    • 类名.newInstance()

    • 如果没有无参的构造方法会报错

    • // 第一种方式
      Class c11 = Class.forName("com.lening.reflection.User");
      // 第二种方式
      /*User user = new User();
      Class c2 = user.getClass();*/
      // 第三种方式  类名.class   过去类的信息
      Class c3 = User.class;
      // newInstance() 是实例化对象
      User user = (User) c3.newInstance();
      //System.out.println(user.toString());
      // 设置对象的属性
      Field name = c3.getDeclaredField("name");
      name.setAccessible(true);
      name.set(user,"wen");
      System.out.println(user.toString());
      
  3. 获取类对象的信息

    • 类对象.getName() 获取属性的名字

    • 类对象.getSimpleName() 获取本类的名称

    • 类对象.getPackage() 获取类的包路径

    • 包对象.getName() 获取包的路径

    • Class<User> c1 = User.class;
      User user = c1.newInstance();
      // 类.getName  获取类的全路径
      System.out.println(c1.getName());
      // 类.getClass  获取类的加载器
      System.out.println(c1.getClass());
      // 类.getSimpleName()  获取类的名字
      System.out.println(c1.getSimpleName());
      // 类.getPackage()  获取这个类的包路径   包对象.getName()  获取这个包的名字
      System.out.println(c1.getPackage());
      
  4. 获取已知类的父类对象,实现类接口

    • 类对象.getSuperClass();
    • 类对象.getInterfaces();
  5. 类属性的操作

    • 对象.getDeclaredField("属性名") 获取本类的属性

    • 对象.getFields("属性名") 获取公共的属性+继承的属性

    • 属性对象.getName() 获取属性的名字

    • 属性对象.getType() 获取属性的类型

    • Modifier.toString(属性对象.getModifiers()) 获取属性的修饰符

    • 转换成修饰符状态 如果不转会是数字Modifier.toString()

    • // 对属性的操作
      User user = new User();
      Class c1 = user.getClass();
      // 类.getFieIds()    获取公共属性和继承的属性
      //Field[] fields = c1.getFields();
      // 类.getDeclaredField("属性名");   获取本类中属性,然后set值  get值
      Field name = c1.getDeclaredField("name");
      /*name.setAccessible(true);
      name.set(user,"wen");
      System.out.println(user.toString());*/
      // 属性对象.getName()   获取属性的名字
      System.out.println(name.getName());
      // 属性对象.getType()   获取属性的类型
      System.out.println(name.getType());
      // Modifier.toString(属性对象.getModifiers())   获取属性的修饰符
      // 转换成修饰符状态  如果不转会是数字Modifier.toString()
      System.out.println(Modifier.toString(name.getModifiers()));
      /*Field[] declaredFields = c1.getDeclaredFields();
      
      for (Field declaredField : declaredFields) {
          declaredField.setAccessible(true);
      }
      declaredFields[0].set(user,"王恩");
      declaredFields[1].set(user,11);
      declaredFields[2].set(user,175);
      System.out.println(user.toString());*/
      
  6. 赋值,取值

    • 如果是private的 需要在赋值和取值之前授权

    • 属性.setAccessible(true);

    • 类.getDeclaredConstructor(属性类型.class.....) 获取类的构造器

    • 类.getMethods() 获取公共类的方法+继承类的方法

    • 类.getDeclaredMethods() 获取本类中所有的方法

    • 方法名.getReturnType() 获取方法的返回值类型

    • 属性对象.getParameterTypes() 获取方法参数列表

    • // 通过反射调用方法
      Class c1 = User.class;
      // 每一步都需要实例化对象
      User user = (User) c1.newInstance();
      // 类.getDeclaredMethod("set属性",属性的.class)    获取本类的方法
      Method setName = c1.getDeclaredMethod("setName", String.class);
      setName.invoke(user,"王恩");
      System.out.println(user.getName());
      // 方法名.getReturnType()  获取返回值类型
      System.out.println(setName.getReturnType());
      
  7. 通过反射invoke()方法来进行赋值运行。

    • // 通过反射调用方法
      Class c1 = User.class;
      // 每一步都需要实例化对象
      User user = (User) c1.newInstance();
      // 类.getDeclaredMethod("set属性",属性的.class)    获取本类的方法
      Method setName = c1.getDeclaredMethod("setName", String.class);
      setName.invoke(user,"王恩");
      System.out.println(user.getName());
      // 方法名.getReturnType()  获取返回值类型
      System.out.println(setName.getReturnType());
      

反射的方法

原文:https://www.cnblogs.com/WangEn/p/14617178.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!