【问题标题】:how to flatten an inherited class?如何展平继承的类?
【发布时间】:2013-05-14 23:59:20
【问题描述】:

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

如果你有这样的课程:

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

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

【问题讨论】:

  • 你能解释一下为什么需要它吗?
  • @Jarede:你可以检查 java 反射。您可以检查声明的方法,例如:docs.oracle.com/javase/7/docs/api/java/lang/…, java.lang.Class...)
  • Jayan 的评论是对的。如果您使用的是 Eclipse,则对象检查器(在您编写 . 点后显示可用于对象的方法)以粗体显示在更具体的类中声明的方法(因此,对于 Worker 变量, setJob 会加粗,setName 不会)

标签: java oop object inheritance


【解决方案1】:

Method 类中的isBridge 方法可用于检查该方法是否在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

【讨论】:

  • @Jarede,哎呀。它是一个错字。修复它
【解决方案2】:

您可以使用Reflection API 来检查对象中是否存在方法,但我不明白您为什么要这样做。记住多态性是如何工作的,我们应该将您的Worker 实例视为WorkerPerson,但为什么要将它视为Worker 视为“不完全是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;
}

无论如何,在应用程序(而非框架)代码中对 Reflection API 的任何使用都被视为 hack,并表明您想做奇怪的事情(通常是错误的)。

【讨论】:

    【解决方案3】:

    如果我理解你的问题,你可以试试这个方法:

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

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多