如何在Java中获取对象类?

如何在Java中获取对象类?,java,performance,class,comparison,Java,Performance,Class,Comparison,获取实例类的最佳方法是什么 推荐的方法是什么?以下各项之间的区别(性能)是什么: 比较班级 if(this.getClass().equals(MyClass.class)){ 这似乎与this.getClass()==MyClass.class相同(或者使用class.forName(“com.test.MyClass”)) 测试的实例(看起来更可读) 使用类测试实例 if( MyClass.class.isInstance(myInst) ){ 我建议this.getClass(

获取实例类的最佳方法是什么

推荐的方法是什么?以下各项之间的区别(性能)是什么:

  • 比较班级
if(this.getClass().equals(MyClass.class)){
这似乎与
this.getClass()==MyClass.class
相同(或者使用
class.forName(“com.test.MyClass”)

  • 测试的实例(看起来更可读)

  • 使用类测试实例

    if( MyClass.class.isInstance(myInst) ){
    

我建议
this.getClass().equals(MyClass.class)
当您想要精确匹配一个类时,因为
对象的“someString”实例将生成true,因为String类是对象的子类型

这是检查任何实例和类之间的
关系

在您的情况下,
MyClass
的任何子类都将生成
true

  • instanceof
    测试左侧的对象是右侧类型的实例还是某个子类型
  • getClass()==…
    测试类型是否相同

  • 选项一只告诉您类是否正是您正在测试的。这通常不是很有用。例如,对于接口来说,它完全没有意义。如果这是您真正想要做的,您可能可以使用
    =
    ,除非您正在使用不同的
    类加载器,在这种情况下,可能会有超过每个
    对象的一个实例

    选项二告诉您对象是否可以静态地分配给给定的类(即可以强制转换给它)


    选项三与选项二相同,但使用。只有在进行动态键入时才需要此选项。内置的
    instanceof
    可读性更强,效率也更高。

    您关于如何获取类的问题和比较类的示例似乎相互矛盾。您想知道什么?如何比较类型?
    Class.forName(“com.test.MyClass”)
    应该避免,因为
    字符串
    MyClass更难重构。class
    超类不应该依赖其子类的细节。闻起来像是糟糕的工程。你到底想做什么?@OrangeDog哼哼……你说得对……我想检查一下用户是否有权在s上做一些事情everals类,以同样的方式。因此,我将代码分解为超类(抽象)这就解决了这个问题。但是,现在我认为超类应该在每个子类中使用一个被重写的抽象方法。你甚至可以将大部分代码保存在超类中的
    public
    方法中,并让每个子类重写一个
    protected
    方法来执行不同的操作,如果你这样做有意义的话。其他rwise可能会使用
    SecurityCheck
    接口或其他什么。你也可以澄清为什么你认为你的方式超越了其他可能性
    if( MyClass.class.isInstance(myInst) ){