Java反射检查传递的对象是否为相同类型

Java反射检查传递的对象是否为相同类型,java,reflection,Java,Reflection,我有一门比较法的课。该方法将两个对象作为参数。 通过java反射,我能够获得所有私有和受保护字段,并使用一些奇特的东西检查它们的返回类型,然后用它们做我想做的事情 这对我个人有好处。我知道我想做什么,所以我只是比较两个相同类型的对象,仅此而已 但是。。。这是很多人使用的…他们有时无法阅读我放在那里的Javadocs、注释和其他东西,所以我必须检查他们是否传递相同类型的对象。例如,您有: a车,b车,a车,b车。。。等等 我需要检查两个传递的参数是否实际上是相同的类型,以便进行比较(Car-wit

我有一门比较法的课。该方法将两个对象作为参数。 通过java反射,我能够获得所有私有和受保护字段,并使用一些奇特的东西检查它们的返回类型,然后用它们做我想做的事情

这对我个人有好处。我知道我想做什么,所以我只是比较两个相同类型的对象,仅此而已

但是。。。这是很多人使用的…他们有时无法阅读我放在那里的Javadocs、注释和其他东西,所以我必须检查他们是否传递相同类型的对象。例如,您有: a车,b车,a车,b车。。。等等 我需要检查两个传递的参数是否实际上是相同的类型,以便进行比较(Car-with-Car,Truck-with-Truck…)

所以。。。我不知道这件事。。我是否应该使用反射来列出所有字段的大小,然后检查所有字段是否具有相同的名称? 还是有更好的解决方案?因为如果fieldsOfA.size与fieldOfB.size相同,就需要编写这样的内容。。。然后为这个循环,如果它们是相同的,检查名称看起来有点奇怪

还有一个问题。 这些对象具有其他对象的列表-例如,汽车具有车轮列表。。 你正在把车轮和其他汽车进行比较。 它们在列表中有1号轮、2号轮、3号轮和4号轮。。 第二辆车有1轮、2轮、4轮和3轮

物体是一样的,但只是换了位置。有没有办法防止这种情况发生?我有一个跟踪代码,可以存储这些对象的所有差异。。因此,如果他们有不同的立场,这给了我两个变化。。车轮3与其他车辆不同,车轮4与其他车辆不同

但是他们还是一样的。。。
我不知道如何通过思考来解决这个问题。。。有什么想法吗?

您可以使用
instanceof
操作符

例如:

public boolean isCar(Vehicle x) {
    if (x instanceOf Car) {
        return true;
    } else {
        return false;
    }

    // note: you can also just do "return x instanceof Car"
}

您可以使用
instanceof
运算符

例如:

public boolean isCar(Vehicle x) {
    if (x instanceOf Car) {
        return true;
    } else {
        return false;
    }

    // note: you can also just do "return x instanceof Car"
}

要比较类,只需使用
if(object1.getClass()==object2.getClass())
要比较类,只需使用
if(object1.getClass()==object2.getClass())
公平地说,要么是
a.getClass().isInstance(b)
要么是
a.getClass().isAssignableFrom(b)
,但我总是忘记哪个是哪个

boolean isInstance(Object obj)
Determines if the specified Object is assignment-compatible with the object represented by this Class.

布尔isAssignableFrom(类cls)
确定此类对象表示的类或接口是否与指定的类参数表示的类或接口相同,或者是其超类或超接口。

你可能需要第一个。

为了公平起见,它要么是
a.getClass().isInstance(b)
要么是
a.getClass().isAssignableFrom(b)
,但我总是忘记哪个是哪个

boolean isInstance(Object obj)
Determines if the specified Object is assignment-compatible with the object represented by this Class.

布尔isAssignableFrom(类cls)
确定此类对象表示的类或接口是否与指定的类参数表示的类或接口相同,或者是其超类或超接口。

您可能需要第一种方法。

这听起来像是在尝试编写通用的Equals方法。以防万一:请注意,在一般情况下,这将失败,因为对象相等不一定意味着所有字段都相等,甚至不意味着所有公共字段都相等。即使某些字段不同,两个Java对象也可能故意相等。给定类的两个实例之间的相等是由设计该类的程序员定义的,任何子类化该类的人都隐式地遵守其相等约定

有鉴于此,试图挖掘对象超类的私有字段通常是个坏主意。一个更好的主意:
super.equals()

所以,假设您编写了一个扩展Vehicle的类Truck,Truck定义了两个私有字段,
maxLoad
hasTrailerHitch
。定义两辆卡车是否相等;假设需要这两个字段相等。实际上,您可能还希望它们满足车辆定义的任何平等条件。因此,您的
equals
可能看起来像这样:

@Override
public boolean equals(Object obj) {
    // check for type
    if (!(obj instanceof Truck)) return false;
    // check private fields
    Truck other = (Truck)obj;
    if (this.maxLoad != other.maxLoad ||
        this.hasTrailerHitch != other.hasTrailerHitch) return false;
    // check for Vehicle equality
    if (!super.equals(obj)) return false;
    // everything checks out!
    return true;
}
为了便于展示,我写的这篇文章比我实际写的要简洁一些。检查的顺序并不重要;我把超类检查放在最后,因为我知道两个私有字段比较运行得非常快,但我不一定知道检查车辆涉及到什么

注意instanceof是如何工作的。如果有人(包括您!)稍后编写Truck的子类,instanceof将为true,因此如果他们执行与您相同的操作并调用
super.equals(obj)
,您的
Truck.equals
将检查这两个私有字段,这是应该的。如果您没有进行
instanceof
检查,而是更加严格,请说:

if (obj.getClass().getName().equals("my.pkg.Truck")) // ...

然后,Truck的子类将无法正确检查这些私有字段。例如,
DumpTruck
的两个实例永远不会相等-可能不是您想要的。

这听起来像是您试图编写一个通用的equals方法。以防万一:请注意,在一般情况下,这将失败,因为对象相等不一定意味着所有字段都相等,甚至不意味着所有公共字段都相等。即使某些字段不同,两个Java对象也可能故意相等。给定类的两个实例之间的相等是由设计该类的程序员定义的,任何子类化该类的人都隐式地遵守其相等约定

有鉴于此,试图挖掘对象超类的私有字段通常是个坏主意。一个更好的主意:
super.equals()

所以,假设您编写了一个扩展Vehicle的类Truck,Truck定义了两个私有字段,
maxLoad
hasTrailerHitch
。定义两辆卡车是否相等;假设你需要b