Java - 如何找到Object所属的类

时间:2010-11-09 19:47:26

标签: java

在Java中是否有任何方法可以找到对象所属的类?

class WrapperClass
{
    SomeObject o;
    ...
    someMethodOfWrapperClass()
    { ... }
}

[...]

SomeObject foo = new SomeObject();
WrapperClass wrap = new WrapperClass();
wrap.o = foo;

有没有办法从 SomeObject对象或其中一个方法中找到相应的WrapperClass对象wrap
有点像:

foo.getWrapperClassObject().someMethodOfWrapperClass();

非常感谢你!!

托马斯

6 个答案:

答案 0 :(得分:2)

简短的回答是“不”。

你可以像robev建议用户那样做,并将对包装类的引用传递给SomeObject,但这会在两个类之间创建一个循环关系,WrapperClass不再真正< / em>一个包装类。

这引出了为什么你试图这样做的问题。

在大多数情况下,当我们创建一个包装类时,我们正在包装我们无法控制的代码,因此您通常甚至无法修改SomeObject的构造函数。

您是否考虑过尝试继承?也许您的WrapperClass应该扩展SomeObject,并将someMethodOfWrapperClass()方法添加为其他行为。

也许是这样的:

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

答案 1 :(得分:0)

你可以有一个父子关系,其中SomeObject被告知其父是谁,所以当你执行getWrapperClassObject()时,你只需返回存储的父指针。

示例构造函数:

SomeObject(WrapperClass parent) { this.parent = parent; }

答案 2 :(得分:0)

在SomeObject中:WrapperClass.this.someMethodOfWrapperClass();

答案 3 :(得分:0)

我真的不能想到做你想要做的事情是有道理的......但是你可能会发现内部阶级在做这件事时很有用......

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,它只是隐藏并由编译器创建)。

答案 4 :(得分:0)

正如其他人所说,这是非常可疑的代码。

有几种方法可以实现它。

  1. 一个是添加对包裹的SomeObject的引用,但这会导致像Justin指出的循环依赖。
  2. 其次,只是简单地制作SomeObjectWrapper extends SomeObject,但你甚至可以控制那部分代码吗?
  3. 最后一个是设置一个约定并使用反射来获取代码(我使用的是WrappedObject.name +“Wrapper”):

    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);
    
  4. 但这对于任何用途来说都太笨拙了。例如,如果你制作Object o = new Integer,整个事情就会从异常中爆发。

答案 5 :(得分:0)

这个问题没有意义。对象不是“类的一部分”。 引用是类的一部分,但它们指的不是。多个引用可以指向同一个对象。因此,您甚至无法获得任何特定对象的唯一引用,更不用说引用所在的类。