【问题标题】:Can you get the subclass of a Method that was inherited?你能得到一个被继承的方法的子类吗?
【发布时间】:2014-10-27 22:28:11
【问题描述】:

看看这段代码:

public class Main {

    public class A {
        public final void method() {}
    }

    public class B extends A {}

    public static main() {
        try {
            Method method = B.class.getMethod("method");

            //Returns the name of Main$A, but I want Main$B
            System.out.println(method.getDeclaringClass().getName());
        } catch (NoSuchMethodException e) {}
    }
}

我正在尝试从我之前从子类中获取的继承方法中获取该类。这样做的原因是在我的应用程序中,我将具有指定注释的所有方法按对象存储到 Set<Method> 中,并将对象本身存储在 Map<Class<?>, Object> 中,以便以后轻松调用该方法。

我知道method.getDeclaringClass() 返回Main$A 是有意义的,因为这是声明它的地方,而不是Main$B,但我只是想知道是否有其他方法可以解决我的问题。

【问题讨论】:

  • 什么问题?当您拥有子类的实例时,您将从子类中获得实现。这是设计使然。
  • @ElliottFrisch 我认为他们会使用 B.class 进行查找。
  • @ElliottFrisch 我的子类 B 没有并且 不能 覆盖 A 中的方法;我将编辑问题以反映这一点。例如,我想将B 的实例存储在Map<Class<?>, Object> 中,通过键Class<B> 和方法method() 存储在Set<Method> 中,如我的应用程序中所述。这就是问题所在:稍后,我将尝试通过getDeclaringClass() 方法(现在是Class<A>)将类从method() 中取出。然后我会继续尝试通过该类将实例从我的地图中取出,并获得一个 NPE。
  • @Octopod 在填充Map 时您可以访问什么?
  • 只需创建一个包含Method 和所需Class 的对象。您可能会认为该对象的正确 hashCodeMethod.hashCode uses only the declaring class and the name,如果您的重载方法仅在参数类型上有所不同,则它在 HashSet 中的表现不佳......

标签: java inheritance reflection methods


【解决方案1】:

您正试图以与 java 标准不兼容的方式重新索引类方法。我认为没有解决方法。你的代码应该反映事物的结构方式; IE。 使用getDeclaringClass() 返回的类填充您的地图。

【讨论】:

  • 我相信这就是他们正在做的事情。
  • 嗯,按照我的理解,他把B.class放在了map中,但是这个方法属于父类,所以他不能用getDeclaringClass的结果去引用map。
  • 我用 object.getClass() 作为键填充了地图,但存储的实例也必须在单独的键中;假设 B、C 和 D 类都扩展 A;我不能将它们全部存储在键 A.class 下,因为在我的应用程序中,我的简化类 A 中有一个抽象方法,method() 可以访问。不过还是谢谢你的回答。
  • 你可能需要一些更高级的东西,Map<Class, Map<Class, Object>> 来存储给定父类的所有子类(及其对应的实例)。
猜你喜欢
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 2013-06-24
  • 2016-11-26
  • 2016-05-29
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多