Java—如何查找对象所属的类
Java中有没有办法找到对象所属的类Java—如何查找对象所属的类,java,Java,Java中有没有办法找到对象所属的类 class WrapperClass { SomeObject o; ... someMethodOfWrapperClass() { ... } } [...] SomeObject foo = new SomeObject(); WrapperClass wrap = new WrapperClass(); wrap.o = foo; 有没有办法从SomeObject对象或其方法中找到相应的WrapperClass对
class WrapperClass
{
SomeObject o;
...
someMethodOfWrapperClass()
{ ... }
}
[...]
SomeObject foo = new SomeObject();
WrapperClass wrap = new WrapperClass();
wrap.o = foo;
有没有办法从SomeObject对象或其方法中找到相应的WrapperClass对象wrap
大致如下:
foo.getWrapperClassObject().someMethodOfWrapperClass();
提前非常感谢你
Thomas您可以建立父子关系,其中SomeObject被告知其父对象是谁,因此当您执行getWrapperClassObject()时,您只需返回存储的父指针 示例构造函数:
SomeObject(WrapperClass parent) { this.parent = parent; }
在SomeObject中:
WrapperClass.this.SomeMethodOfRapperClass()代码>简短的回答是“否”
您可以按照用户robev的建议,将对包装器类的引用传递到SomeObject
,但这会在两个类之间创建循环关系,WrapperClass
不再是真正的包装器类
这就引出了一个问题:你为什么要这么做
在大多数情况下,当我们创建一个包装类时,我们正在包装我们无法控制的代码,所以通常您甚至无法修改某个对象的构造函数
你想过尝试继承吗?也许您的WrapperClass
应该扩展SomeObject
,添加someMethodOfRapperClass()
方法作为附加行为
也许是这样的:
public class ExtendingClass extend SomeObject
{
public void someMethodOfExtendingClass()
{ ... }
}
// so you can define an instance 'foo' which is ALSO an instance of SomeObject
ExtendingClass foo = new ExtendingClass();
// now you can call...
foo.someMethodOfExtendingClass();
我真的想不出有什么情况下,做你想做的事情是有意义的。。。但是你可能会发现一个内部类在这方面很有用
class Outer
{
Inner inner = new Inner();
class Inner
{
void foo()
{
bar();
}
}
void bar()
{
System.out.println("bar");
}
public static void main(String[] argv)
{
Outer o;
o = new Outer();
o.inner.foo();
}
}
robev的答案基本上是一样的,但robev有一个更通用的答案(在我发布的代码中,Inner引用了Outer,它只是被编译器隐藏和创建的)。正如其他人所说,这是非常可疑的代码
有几种方法可以实现它
一种是添加对包装的SomeObject
的引用,但这会导致像Justin指出的循环依赖
第二,简单地让SomeObjectWrapper扩展SomeObject
,但您甚至可以控制代码的这一部分吗
最后是设置一个约定并使用反射来获取代码(我使用的是WrappedObject.name+“Wrapper”):
但这太笨拙了,没有任何用处。例如,如果你使对象o=newinteger,整个事情就会从异常中爆发。这个问题没有意义。对象不是类的“一部分”。引用是类的一部分,但它们指向的不是。多个引用可以指向同一对象。因此,您甚至无法获得任何特定对象的唯一引用,更不用说引用所在的类了。这是一些非常难闻的代码。看来他应该用继承来代替。但是如果不在两个类之间引入循环依赖关系(这是很糟糕的),就无法让它像上面所建议的那样工作。我的建议是放弃这种设计,首先想想为什么你真的需要它。否则,在SomeObject类中有一个指向其包装器对象的链接。这甚至不能满足原始海报的要求。如果您可以控制SomeObject,那么这很好,但是在这种情况下包装SomeObject是没有意义的,为什么不将所需的方法添加到SomeObject呢。通常,当我们无法控制类的内容时,我们会将其包装起来。这也造成了一种循环依赖。好的一点,TofuBeer,尽管我真的不想鼓励原始海报使用这种设计。在我看来,他们似乎需要让包装器类扩展原始类,以便调用附加方法。我的假设是,他可以控制包装器对象,但不能控制源对象。如果是这样的话,选择2就行了。是的,这将是最合乎逻辑的事情;不知何故,这个问题的关键在于设计包装对象而不是包装器。
package test;
public class ObjectWrapper {
Object o;
public ObjectWrapper(Object o){
this.o = o;
}
}
Object o = new Object();
String pack = "test";
String name = package+o.getClass().getSimpleName()+"Wrapper";
Class objWrapper = Class.forName(name);
objWrapper.getConstructor(Object.class).newInstance(o);