3

有没有办法扁平化继承的类以发现哪些函数属于哪个类?

如果你有这样的课程:

public class Person
{
    public String name;

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
}

和一个继承的类

public class Worker extends Person
{
    public String job;

    public void setJob(String job){
        this.job = job;
    }

    public String getJob(){
        return this.job;
    }
}

当你实例化 Worker 时,有没有办法找出 Set/GetName 属于 Person 类?

我已经看到使用界面来查找此信息的建议,但我不确定如何最好地使用界面来显示此处的函数关系类型。能够在继承类中引用特定类有什么秘籍吗?

编辑:

要回答我为什么要这样做:我基本上希望能够遍历对象中的方法并忽略来自某个类的方法,在这种情况下我想忽略 Person 类。

我的现实世界的例子并不像这样简单,但我想不出更好的方法来确定哪些方法属于哪个类而不“扁平化”它们。

4

3 回答 3

6

类中的isBridge方法Method可用于检查该方法是否在PersonWorker类中声明。

public static void main(String[] args) 
{
    Worker worker = new Worker();
    Class clazz = worker.getClass();
    Method[] methods = clazz.getDeclaredMethods();

    for(Method method :methods)
    {
        System.out.println(method.getName()+ " is in Worker: "+ !method.isBridge());
    }
}

上面的代码将产生如下输出:

setName is in Worker: false
getName is in Worker: false
setJob is in Worker: true
getJob is in Worker: true
于 2013-05-20T12:31:23.013 回答
1

您可以使用反射 API来检查对象中是否存在方法,但我不明白您为什么要这样做。记住多态性是如何工作的,我们应该将您的实例Worker视为 asWorker或 as Person,但为什么要将它Worker视为“不完全 a Person”?

Worker w = new Worker();
Class c = w.getClass();
Class noparams[] = {};

boolean hasSetJob = false;
try{
    c.getDeclaredMethod("setJob", noparams);
    hasSetJob = true;
} catch (NoSuchMethodException e) {
    hasSetJob = false;
}

无论如何,在应用程序(而不是框架)代码中对反射 API的任何使用都被视为一种黑客行为,并且表明您想要做一些奇怪的事情(这通常是错误的)。

于 2013-05-20T12:34:49.377 回答
1

如果我了解您的问题,您可以尝试以下方法:

Class c = new Worker().getClass();
Method[] ma = c.getMethods();

for (Method m : ma) {
    String methodClass = m.getDeclaringClass().getName();
    if(methodClass.equals("net.yourpackage.Person")){
        // do something...
    }
    else if(methodClass.equals("net.yourpackage.Worker")){
        // do something...
    }
    // ... other classes
    else if(methodClass.equals("java.lang.Object")){
        // do something else...
    }
}
于 2013-05-20T14:04:01.913 回答