【问题标题】:Using reflection - how to get all fields and methods使用反射——如何获取所有字段和方法
【发布时间】:2013-04-02 09:01:58
【问题描述】:

使用 Java 反射:

  • 如何获取给定对象的所有方法(私有、受保护、公共等)
  • 也许还可以创建类的结构表示
  • 最后,将对象序列化为字符串或字节数组

这个想法看起来不错吗?或者这不会让我到任何地方?

我想要实现的是能够:

  • 将任意java.lang.Object序列化为字节数组或字符串
  • 未实现Serializable 的类/对象将被扔到我的应用程序中进行序列化

【问题讨论】:

  • 你有什么尝试吗?只需查看有关反射的文档。
  • 为什么要为各种对象做呢?如果 all 对象不需要它,为什么现有的序列化库对你不满意?

标签: java


【解决方案1】:

听起来很复杂。只需使用XStream

String xml = new XStream().toXML(whatever);

【讨论】:

  • 我对这种 XML 封送处理的担忧是实际类型可能会丢失,这个 Xtream 库是否返回相同的对象类型?还是只是字符串?
【解决方案2】:

问题一:如何获取一个类的所有方法。

getDeclaredMethods 将为您提供对类中所有方法的访问权限。

返回反映所有声明方法的 Method 对象数组 由此 Class 对象表示的类或接口。这个 包括公共、受保护、默认(包)访问和私有 方法,但不包括继承的方法。

示例:Method[] methods = Integer.class.getDeclaredMethods();

问题 2:创建类的结构表示

我不确定您为什么需要这样做,因为它已经存在。您始终可以检索对象的类,它为您提供了它的结构。

【讨论】:

    【解决方案3】:

    要获取一个类的所有方法和字段,请使用getDeclaredMethodsgetDeclaredFields。我不确定您是否可以使用它来重新组合一个不可序列化的类,我也不确定我是否会这样做。但也许你可以在这里找到一些想法:How to serialize a non-serializable in Java?

    【讨论】:

      【解决方案4】:

      Class.getDeclaredMethods()Class.getDeclaredFields() 返回方法和字段,具有仅在当前类中声明的任何可见性。这些方法不返回继承的东西。为此,您必须遍历类层次结构并为每个超类调用这些方法,即:

      List<Method> methods = new ArrayList<>();
      List<Field> fields = new ArrayList<>();
      for (Class c = clazz; c != null; c = c.getSuperClass()) {
          methods.add(c.getDeclaredMethods());    
          fields.add(c.getDeclaredFields());    
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 2016-01-28
        • 2022-01-08
        相关资源
        最近更新 更多