如何检索父接口的实现类/接口?

时间:2016-05-31 20:40:57

标签: java spring oop

我很清楚oop的多态性和继承概念,但我需要知道实现类。例如:

public CommonReadRepository<?> getReadRepository(String tableName) {
        if (tableName == null)
            return null;
        switch (tableName) {
        case "order":
            return orderRepository;
        ...
        }
        return null;
    }

接口orderRepository扩展CommonReadRepository,由于我的要求,我需要访问orderRepository中定义的函数。

CommonReadRepository<?> repository=getReadRepository("order");

有没有办法检查CommonReadRepository的实现(子)类或接口?

当然,我总能做到这样的事情:

if(tableName=="order")
return (OrderRepository)CommonReadRepository<?>;

我尝试调试getReadRepository("order"),但它给了我一个JdkDynamicAopProxy的实例,我不确定它是如何工作的。

  

if(interface is instanceof xyz class)   我不想使用它,因为我有100个课程,我想把它作为最后的手段...或换句话说    我不知道xyz类

由于

2 个答案:

答案 0 :(得分:1)

以下是检查返回的Object是否是指定类的实例的一种方法:

CommonReadRepository<?> repository=getReadRepository("order"); if(repository instanceof WhatEverSubclass) { // do something }

但是使用这种方法并不是OOP应该如何完成的。如果你的类都实现了相同的接口,为什么不定义一个公共方法,然后在所有子类中使用它,但每次都以不同的方式实现它。

答案 1 :(得分:0)

我认为,你试图做的不是让你到任何地方。

您可以使用反射工具(https://github.com/ronmamo/reflections)找到继承界面的所有可用类。我用它作为依赖注入器,它非常可靠。

然而,为什么不使用instanceof运算符来确保对象的类型正确:

if( repository instanceof OrderRepository) return (OrderRepository)repository;

但是,这不会改变函数的返回类型,你需要在函数之外再次检查返回值的类型。

更新:如果对数百个对象发生这种情况,您可以更改getRepository方法以返回您作为参数提供的类型:<T> getRepository(String name, Class<T> expectedType)

这将允许您OrderRepository o = getRepository("order", OrderRepository.class);