如何压扁继承的类?

时间:2013-05-20 12:15:25

标签: java oop object inheritance

有没有办法压缩继承的类来发现哪些函数属于哪个类?

如果您有类似的课程:

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类。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用Reflection API来检查对象中是否存在方法,但我不明白为什么要这样做。记住多态性是如何工作的,我们应该将Worker的实例视为WorkerPerson,但为什么将它视为Worker为“不是Person {1}}“?

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;
}

无论如何, Reflection API 在应用程序(而不是框架)代码中的任何用途都被视为黑客和一个你想做奇怪事情的标志(通常是错误的)。

答案 2 :(得分: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...
    }
}