我有一个班级:
class Superclass { static List list() { ... } }
和子类:
class Subclass extends Superclass { ... }
class Subclass2 extends Superclass { ... }
我想调用这样的list
方法:Subclass.list()
或Subclass2.list()
,并根据调用它的子类做一些不同的事情。
有没有办法告诉哪个子类调用list
方法?
注意:我不想在每个子类中覆盖list
方法。
更新:每个人都说这是糟糕的设计,在大多数情况下我认为会是这样,但在我的情况下,我不这么认为。我的ORM定义了java.lang.Class
的方法。我想提供我的ORM方法的简写,以便我可以说User.list(...)
而不是ORM.list(User.class, ...)
。
答案 0 :(得分:1)
听起来像是接口/实现问题。
为list()方法创建一个接口,然后编写两个实现,Subclass使用implementation1,Subclass2使用implementation2。
<强>更新强>
查看我的评论,看看这个问题How do I find the caller of a method using stacktrace or reflection?
与所有人的评论一样,我认为您需要重新考虑您的设计,并且要么像Oli所述覆盖子类中的方法,要么创建接口和实现。
答案 1 :(得分:1)
你的意思是子类会调用该方法吗?那么这应该是一个实例方法(不是静态的),抽象的,子类将提供实现。
或者你的意思是覆盖静态方法?这是不可能的,至少不是有意义的。您可以尝试通过在子类中定义超类静态方法来隐藏它,但这不是真正的继承关系。
答案 2 :(得分:1)
我同意这不是最好的设计。无论如何,如果你有令人信服的理由,这是一个解决方案 -
以下代码段应打印
SuperClass.list() - 由子类调用
或
SuperClass.list() - 由Subclass2
...
static List list() {
System.out.println("SuperClass.list() - called by "+Thread.currentThread().getStackTrace()[3].getClassName());
//[3] because you want to skip these last three calls to get to this information -:)
}
...
答案 3 :(得分:0)
你可以让list方法取一个arg,调用像
这样的方法Subclass.list(type)
然后测试类型。它有点思路。您可能想要考虑不同的设计选项。创建
可能更好listForSubclass1
或
listForSubclass2
方法,但即便如此,这似乎也不对......
答案 4 :(得分:0)
至于知道是谁打电话:一般来说,找出通话类也没什么不同。传统上,这是通过抛出异常,捕获它并检查堆栈跟踪来完成的。但是后来JDK有方法访问堆栈跟踪而不抛出异常(Thread.getStackTrace(),从1.5开始可用)。