Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何检查对象是否是非静态内部类的实例,而不考虑外部对象?_Java_Inner Classes_Instanceof - Fatal编程技术网

Java:如何检查对象是否是非静态内部类的实例,而不考虑外部对象?

Java:如何检查对象是否是非静态内部类的实例,而不考虑外部对象?,java,inner-classes,instanceof,Java,Inner Classes,Instanceof,如果我有一个内部类,例如 class Outer{ class Inner{} } 有没有办法检查任意对象是否是任何内部的实例,而不管其外部对象是什么instanceof给出false。我知道一个解决方法就是将内部变成一个静态类,但我想知道我所要求的是否可行 例如: class Outer{ Inner inner = new Inner(); class Inner{} public boolean isInner(Object o){ re

如果我有一个内部类,例如

class Outer{
    class Inner{}
}
有没有办法检查任意
对象
是否是任何
内部
的实例,而不管其外部对象是什么<当对象不是来自同一
外部
内部
s时,code>instanceof
给出false。我知道一个解决方法就是将
内部
变成一个静态类,但我想知道我所要求的是否可行

例如:

class Outer{
    Inner inner = new Inner();
    class Inner{}

    public boolean isInner(Object o){
        return o instanceof Inner;
    }
}

你可以随时:

getClass().getName()
并进行字符串比较

编辑:要考虑继承(在内部类之间?谁会这样做?!),您可以始终循环通过
getSuperclass()
,并检查它们,甚至跟踪实现的接口。

您是否尝试使用:

返回基础类的立即封闭类如果基础类是顶级类,则此方法返回null。

要获得对象的正确封闭类,IMHO并不那么容易。阅读

有点像黑客的是:

object.getClass().getName().contains("Outer$");

java.lang.Class.GetEnclosuringClass()
方法返回基础类的立即封闭类。如果该类是顶级类,则该方法返回null

以下示例显示了java.lang.Class.GetEnclosuringClass()方法的用法:

输出 ClassDemo$1外部内部在…类ClassDemo

ClassDemo$1外部$1内部输入…类ClassDemo$1外部

那怎么办

public static boolean isInnerClass(Class<?> clazz) {
    return clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers());
}
公共静态布尔值isInnerClass(类clazz){
返回clazz.isMemberClass()&&!Modifier.isStatic(clazz.getModifiers());
}
该方法将测试该方法是否是成员(而不是匿名或本地类),第二个条件将验证您的成员类是否是静态的

顺便说一下,解释了本地类、匿名类和嵌套类之间的区别

嵌套类分为两类:静态类和非静态类。声明为静态的嵌套类称为静态嵌套类。非静态嵌套类称为内部类

o
是任何
外部
内部
实例时,内部
给出
false
,而不是从中调用它

这不会发生在我身上-对于
o instanceof internal
我得到
true
,无论
o
属于哪个特定的封闭实例:

class Outer {
  class Inner {}

  void test() {
    // Inner instance that belongs to this Outer
    Inner thisInner = new Inner();

    // Inner instance that belongs to a different Outer
    Outer other = new Outer();
    Inner otherInner = other.new Inner();

    // both print true
    System.out.println(thisInner instanceof Inner);
    System.out.println(otherInner instanceof Inner);
  }

  public static void main(String[] args) {
    new Outer().test();
  }
}

用Java6和Java7进行测试。

我在谷歌上搜索,寻找更好的答案,发现根本没有答案

以下是我所拥有的非常有效的:

    public static boolean isStatic(Class klass) {
            return Modifier.isStatic(klass.getModifiers());
    }

    /**
     * Non static inner class
     */
    public static boolean isInnerclass(Class klass) {
            return klass.getDeclaringClass() != null && !isStatic(klass);
    }

对于本地内部类,将返回true。isMemberClass和其他工具不适用于此目的。

@IanRoberts-为什么不?无论父对象是什么,2个内部实例都将具有相同的完全限定类名是的,但是如果
Inner2扩展了Inner
,那么类为
Inner2
的对象就是
Inner
的实例,即使它们的类名不同。@IanRoberts-没错。但仍然可以修复:-)(编辑传入)类的名称不会显示其是否为静态。但这也适用于任何假设的OtherInner?你能提供一个例子,说明
instanceof internal
返回false吗?@cambecc,
o instanceof Outer.internal
o
是任何
Outer
internal
的实例而不是你调用它的实例时,给出false。不确定你的意思是什么“任何
外部
,而不是您呼叫的那一个“。一个快速的代码示例对于回答您的问题非常有用。你的意思不是说
Outer.internal
OtherOuter.internal
应该是相同的
internal
,是吗?@cambecc,包括例子。谢谢你的例子。只是试着运行它;结果为
true
。您确定看到
false
false
的结果将违反JLS§15.20.2,其中规定:“在运行时,如果RelationalExpression的值不为null,则instanceof运算符的结果为true,并且可以将引用转换为ReferenceType,而不会引发ClassCastException。”我们知道
outer2。inner
可以强制转换为
inner
,因为这是它的类型。尝试将
isInner
的参数更改为type
internal
,您将看到不需要显式强制转换,也不会发生编译错误。不确定为什么会看到
false
。请注意,
isMemberClass()
为匿名类和本地类返回false(这很有意义,但可能会令人惊讶)。如果您对这些类类型感兴趣,请使用和。
public static boolean isInnerClass(Class<?> clazz) {
    return clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers());
}
class Outer {
  class Inner {}

  void test() {
    // Inner instance that belongs to this Outer
    Inner thisInner = new Inner();

    // Inner instance that belongs to a different Outer
    Outer other = new Outer();
    Inner otherInner = other.new Inner();

    // both print true
    System.out.println(thisInner instanceof Inner);
    System.out.println(otherInner instanceof Inner);
  }

  public static void main(String[] args) {
    new Outer().test();
  }
}
    public static boolean isStatic(Class klass) {
            return Modifier.isStatic(klass.getModifiers());
    }

    /**
     * Non static inner class
     */
    public static boolean isInnerclass(Class klass) {
            return klass.getDeclaringClass() != null && !isStatic(klass);
    }