如何知道在创建对象时使用了哪个构造函数?

时间:2009-10-05 00:45:15

标签: java reflection object constructor

考虑

Class A has two constructors new A(int), new A(int, String)

it has a method show()

然后给出一个声明,

A a1= new A(4);
A a2= new A(3, "foo");

以及后来的代码(或者传递这些对象的一些方法)

a1.show();
a2.show();
new A(3).show();
and 
new A(2,"bar").show();

如果我想区分基于对象(a1和a2)的这些show方法以及基于类实例表达式(直接在构造函数上调用show)并且不知道使用了哪个构造函数(特别是对于对象a1)和a2)我怎么发现 - 说反思?

6 个答案:

答案 0 :(得分:1)

执行此操作的唯一方法是让每个构造函数设置一个不同的变量来指示它已被使用。

但我同意汤姆的意见;这听起来像个坏主意。无论你如何创建一个对象(因为一个构造函数甚至根本就没有被使用过,比如说,在序列化中),它应该只关系到所有它的属性(公共或非公共)都被恰当地设置,以反映状态它需要在。

答案 1 :(得分:1)

也许A应该是两个不同的类(每个类都有不同的构造函数);或者公共基类的两个不同的子类:这样,每个类都可以拥有它自己的show方法的独特实现。

或者,在A中有一个数据成员(可能是布尔值或字符串),其值由每个构造函数设置。

答案 2 :(得分:1)

同意你最好使用两个单独的类,在这种情况下你可以使用多态(C#中的例子),

public class Base
{
    public BaseClass()
    public virtual void Show
    {
        // show stuff
    }
}

public class A : Base
{
    public A(int i)
    public override void Show()
    {
        // show A stuff
    }
}

public class B : Base
{
    public B(int i, String s)
    public override void Show()
    {
        // show B stuff
    }
}

然后调用类

Base a1= new A(4);
Base a2= new B(3, "foo");

并且应该很容易区分这些基于a1和a2对象的show方法。

答案 3 :(得分:1)

如果两个类具有不同的行为集,则它们是两个不同的类。根据单个类的构造方式,单个类的行为不应该不同。

答案 4 :(得分:0)

无法通过反射确定使用哪个构造函数来实例化对象。为什么不简单地在每个构造函数中将实例变量设置为不同的值来跟踪哪个被调用?

答案 5 :(得分:0)

因此调用show的所有四种方式都应该执行不同的操作吗?

为什么以及每个行动之间有什么区别?

在不知情的情况下,我们只能做出疯狂的猜测。它听起来像两个甚至四个类(加上一个基类/接口)和一个工厂来创建它们。

如果问题纯粹是理论问题 - 不,你不能在运行时告诉我们之间的区别:

A a = new A();
a.show();

new A().show();

这样做的唯一方法是检查source¹,因此您必须包含源代码并使用包含的完整源代码进行编译。解析源代码以解决它的调用方式。