在java中,如何调用当前类的实例创建者的构造函数?

时间:2010-10-11 18:43:43

标签: java reflection

我有一个班级说'A',一个对象'a'创建一个'B'类对象'b'。现在'b'运行一个想要创建b的父实例的方法(请不要将它与继承混淆) - 创建'b'的类,这里是'A'。

这在Java中是否可行?或者也许一些设计建议可能有用。

谢谢!

编辑:根据建议,我也在添加我的设计要求。我有一个“ExitController”类,它根据调用函数的不同而工作 - 就像它被UserX调用一样,它会终止程序,如果它由UserY调用它会将其记录下来,等等。 通常我应该在我的用户界面中放置一个ExitController方法,但由于我不能使用一些约束。此外,与它提供的使用相比,传递父对象/类名看起来非常昂贵。

2 个答案:

答案 0 :(得分:5)

基本上,您必须将传递父本身或父类型传递给B的构造函数。以下示例说明了最后一种情况。

class A {
    B b;

    A() { 
        b = new B(getClass());
    }
}

class B {
    Class<?> parentClass;

    B(Class<?> parentClass) {
        this.parentClass = parentClass;
    }

    void createParent() throws Exception {
        Object o = parentClass.newInstance();
    }
}

使用generics,您可以使其更安全。但由于功能要求并不完全清楚,我已经离开了。


根据您的更新

更新,创建实例毫无意义。您可以检查类类型并相应地处理。而不是上面示例中的createParent(),请执行:

void exit() {
    if (parentClass == UserX.class) {
        // Terminate program.
    } else if (parentClass == UserY.class) {
        // Logoff user.
    }
}
然而,这很简单。您是否真的 不允许向User界面添加其他方法?否则以下是更好的设计(称为Strategy pattern):

interface User {
    void exit();
}

class ExitController {
    void exit(User user) {
        user.exit();
    }
}

class UserX implements User {
    public void exit() {
        // Terminate program.
    }
}

class UserY implements User {
    public void exit() {
        // Logoff user.
    }
}

根据你上次的陈述:

  

此外,传递父对象/类名与其提供的用途相比看起来非常昂贵

这没有任何意义。你测量过吗?向我们展示结果。

答案 1 :(得分:0)

如果我正确理解您的问题,我认为课程B必须存储对象aA.class的引用。这将允许b构建A的新实例。最简单的方法是让B的构造函数获取类参数。