如何列出一个Object在Java中扩展的所有类?

时间:2013-02-18 18:27:29

标签: java decorator

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

abstract class: plate
concrete class: JapanesePlate, WesternPlate

abstract plateDecorator extends plate
concrete decorators: MeatPlateDecorator, TomatoPlateDecorator,

有时,JapanesePlate可以使用MeatPlateDecoratorTomatoPlateDecorator或两者进行修饰。

我只想知道是否有任何方法可以解释这个问题?

3 个答案:

答案 0 :(得分:2)

您无法找到构成任意装饰层次结构的所有类,因为装饰器具有装饰类的实例,并且不会形成 is-a 关系。

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

如果你碰巧知道如何实现BufferedInputStream,你可以使用反射来检查它正在装饰的流,但这对你的检查没有帮助,比如BufferedOutputStream

答案 1 :(得分:0)

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

   Class objectClass = object.getClass();
   while (objectClass != null) {
     Class parent = objectClass.getSuperClass();
     Class [] implementedInterfaces = objectClass.getInterfaces()

     objectClass =  parent; // continue upward in the hierarchy.
   }

答案 2 :(得分:0)

如果你控制类层次结构,你最好的选择可能就是引入一个装饰器界面:

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

现在你的装饰师走路可以检查特殊的Decorator界面,并且也可以打开包裹的对象。

如果你不能改变课程,你可能不得不依赖反思hackery和启发式。