【问题标题】:How to list all Classes an Object extends in Java? [closed]如何列出对象在 Java 中扩展的所有类? [关闭]
【发布时间】:2013-02-18 18:27:28
【问题描述】:

在 Java 中,我使用的是装饰器模式。有时Object 会获得许多类型,因为它可以用许多类进行装饰。我怎样才能得到一个对象的所有不同类型?

abstract class: plate
concrete class: JapanesePlate, WesternPlate

abstract plateDecorator extends plate
concrete decorators: MeatPlateDecorator, TomatoPlateDecorator,

有时,JapanesePlate 可以用MeatPlateDecoratorTomatoPlateDecorator 或两者装饰。

我只想知道有没有什么办法可以知道?

【问题讨论】:

  • “一个对象有多种类型,因为它可以用许多类进行装饰”是什么意思?如果你能举个例子会有所帮助。
  • 我很感兴趣,您为什么需要这样做?基类知道它的子类是违反 OO 哲学的
  • 其实我并没有使用它,它只是用于一些测试目的。
  • @JonSkeet,我添加了一个例子

标签: java decorator


【解决方案1】:

你不能找到构成任意装饰层次结构的所有类,因为装饰器有一个装饰类的实例,并且不构成一个is-a 关系。

举一个来自 JDK 的具体示例:BufferedInputStream 是输入流的装饰器。它是包含FilterInputStreamInputStream 的类层次结构的一部分,但它不会告诉您它正在装饰 的类。

如果您碰巧知道BufferedInputStream 是如何实现的,则可以使用反射来检查它正在装饰的流,但这无助于检查,例如BufferedOutputStream

【讨论】:

    【解决方案2】:

    使用getSuperClass。如果需要,也可以使用getInterfaces

       Class objectClass = object.getClass();
       while (objectClass != null) {
         Class parent = objectClass.getSuperClass();
         Class [] implementedInterfaces = objectClass.getInterfaces()
    
         objectClass =  parent; // continue upward in the hierarchy.
       }
    

    【讨论】:

    • 实际上,这个 plate.getClass().getSuperclass() 在一定程度上解决了我的问题,但它只返回类 plate.PlateDecorator,但我希望它更具体,例如肉类装饰器或番茄装饰器或两者
    【解决方案3】:

    如果您控制类层次结构,最好的选择可能是引入装饰器接口:

    public interface Decorator<T> {
        T getDecoratedObject();
    }
    

    现在你的装饰器 walk 可以检查特殊的Decorator 接口并撬开包装的对象。

    如果您无法更改类,您可能不得不依赖反射黑客和启发式方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2016-08-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      相关资源
      最近更新 更多