在java中,如何调用当前类的实例创建者的构造函数?
我有一个类叫做“a”,一个对象“a”创建了一个对象“b”类的对象“b”。现在“b”运行一个方法,该方法想要创建一个新的b父实例(请不要将其与继承混淆)——创建“b”的类,如这里所示的“a” 这在Java中有可能吗?或者一些设计建议可能有用 谢谢 编辑:根据建议,我也在添加我的设计要求。我有一个“ExitController”类,根据调用方函数的不同,它的工作方式也不同——比如如果它被UserX调用,它会终止程序,如果它被UserY调用,它会让他注销,等等。 通常我应该在我的用户界面中放置一个ExitController方法,但是由于一些限制,我不能这样做。此外,与父对象/类名提供的用途相比,传递父对象/类名似乎非常昂贵。基本上,您必须将父对象本身或父类型传递到B的构造函数中。下面的示例说明了最后一种情况在java中,如何调用当前类的实例创建者的构造函数?,java,reflection,Java,Reflection,我有一个类叫做“a”,一个对象“a”创建了一个对象“b”类的对象“b”。现在“b”运行一个方法,该方法想要创建一个新的b父实例(请不要将其与继承混淆)——创建“b”的类,如这里所示的“a” 这在Java中有可能吗?或者一些设计建议可能有用 谢谢 编辑:根据建议,我也在添加我的设计要求。我有一个“ExitController”类,根据调用方函数的不同,它的工作方式也不同——比如如果它被UserX调用,它会终止程序,如果它被UserY调用,它会让他注销,等等。 通常我应该在我的用户界面中放置一个Ex
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();
}
}
然而,这显然是丑陋的。您真的不允许向用户界面添加其他方法吗?否则,以下将是更好的设计(称为:
根据你上次的陈述:
此外,传递父对象/类名与它提供的使用相比似乎非常昂贵
这毫无意义。你量过了吗?向我们显示结果。基本上,您必须将父类本身或父类类型传递到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();
}
}
然而,这显然是丑陋的。您真的不允许向用户界面添加其他方法吗?否则,以下将是更好的设计(称为:
根据你上次的陈述:
此外,传递父对象/类名与它提供的使用相比似乎非常昂贵
这毫无意义。你量过了吗?向我们展示结果。如果我正确理解了您的问题,我认为类B
必须存储对对象a
或a.class
的引用。这将允许b
构造a
的新实例。最简单的方法是B
的构造函数采用类参数。如果我正确理解了你的问题,我认为类B
必须存储对对象a
或a.class
的引用。这将允许b
构造a
的新实例。最简单的方法是让B
的构造函数接受一个类参数。这听起来很奇怪,也许你应该重新考虑你的设计。也许你需要一个工厂课程。如果我们真的知道问题是什么,设计建议可能是一个非常好的主意。这听起来像是解决某些问题的部分办法,但不清楚你想解决什么问题。@dobroby是对的。在将来,试着详细阐述功能需求本身,而不是问如何实现一个解决方案,这个解决方案本身可能不是正确的解决方案。这听起来很奇怪,也许你应该重新考虑你的设计。也许你需要一个工厂课程。如果我们真的知道问题是什么,设计建议可能是一个非常好的主意。这听起来像是解决某些问题的部分办法,但不清楚你想解决什么问题。@dobroby是对的。在将来,试着详细阐述功能需求本身,而不是问如何实现一个解决方案,而这个解决方案本身可能不是正确的解决方案。
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.
}
}