Java—如何查找对象所属的类

Java—如何查找对象所属的类,java,Java,Java中有没有办法找到对象所属的类 class WrapperClass { SomeObject o; ... someMethodOfWrapperClass() { ... } } [...] SomeObject foo = new SomeObject(); WrapperClass wrap = new WrapperClass(); wrap.o = foo; 有没有办法从SomeObject对象或其方法中找到相应的WrapperClass对

Java中有没有办法找到对象所属的类

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