Tag: instanceof

检查注释是否属于特定类型

我正在使用reflection来查看附加到类的属性的注释是否是特定类型。 目前我在做: if(“javax.validation.Valid”.equals(annotation.annotationType().getName())) { … } 这让我觉得有点笨拙,因为它依赖于一个完全限定的类名字符串。 如果命名空间将来发生更改,则可能会导致细微错误。 我想要做: if(Class.forName(annotation.annotationType().getName()).isInstance( new javax.validation.Valid() )) { … } 但是javax.validation.Valid是一个抽象类,无法实例化。 有没有办法模拟针对接口或抽象类的instanceof (或基本上使用isInstance )?

如何使用编译时genericsvalidation替换运行时instanceof检查

真正的Java Generics专家有一点难题……;) 假设我有以下两个接口: interface Processor { void process(Foo foo); } interface Foo { Processor getProcessor(); } 例如,以下两个实现类: static class SomeProcessor implements Processor { static final SomeProcessor INSTANCE = new SomeProcessor(); @Override public void process(Foo foo) { if (foo instanceof SomeFoo) { // <– GET RID OF THIS ? // process ((SomeFoo) foo) } } } […]

如何在现代JVM实现中实现instanceof?

由于在其他线程中完成了基准测试(参见https://stackoverflow.com/a/397617/1408611 ),因此可以看出Java 6中的instanceof实际上非常快。 这是如何实现的? 我知道对于单inheritance,最快的想法是有一些嵌套的间隔编码,其中每个类维持一个[低,高]间隔,而instanceof只是一个区间包含测试,即2个整数比较。 但它是如何制作接口的(因为区间包含仅适用于单inheritance)? 如何处理类加载? 加载新的子类意味着必须调整很多间隔。

“instanceof List”和“o instanceof List ”之间的区别

我认为以下内容没有任何区别: Object o = new LinkedList(); System.out.println(o instanceof List); System.out.println(o instanceof List); 如果不能使用instanceof List而不是使用instanceof List实际用法,反之亦然?

通过Collections.unmodifiable *已经用Collections.unmodifiable *包装的实例是多么低效?

我有一些计件工作由不同的自定义(源代码不可用)框架完成,这些框架可以传回Map实例。 不幸的是,这些框架在返回的Map实例中并不一致,这些实例已用Collections.unmodifiableMap包装。 为了确保我的代码中更高程度的不变性(为了更容易的multithreading使用),我在这些框架返回的任何内容上统一调用了Collections.unmodifiableMap。 Map immutableMap = framework.getRecordsByName(); //does this created a nested set of unmodifiableMap wrapper instances? this.immutableField = Collections.unmodifiableMap(immutableMap); . . . Map maybeImmutableMap = framework.getRecordsByName(); //is there some means to get instanceof to work? if (!(maybeImmutableMap instanceof Collections.UnmodifiableMap)) { this.immutableField = Collections.unmodifiableMap(maybeImmutableMap); } 我意识到我的设计可能会遇到性能问题。 在某些情况下,我正在调用Collections.unmodifiableMap向它传递一个实例,该实例已经被同一个调用的框架包装。 而且我的重新包装可能会在整个实例中引起额外的方法调用。 似乎使用“instanceof Collections.UnmodifiableMap”不起作用。 如果我当前引用的Map实例需要被包装,我找不到任何检测方法(不包括使用这种情况下不是选项的reflection – 方式太慢)。 问题: A)Collections.unmodifiableMap()方法是否检查它是否传递了UnmodifiableMap的实例,如果是这样,只返回相同的引用(从而避免在调用方法之前检查)? […]

调用存在于子类中但不存在于父类中的方法

public class Parent { …. } public class Child1 extends Parent { …. public void foo() { …. } } public class Child2 extends Parent { …. public void foo() { …. } } 这里方法foo()只存在于Child类中,不能添加到Parent类(甚至不是抽象方法)。 在这种情况下,当我想在obj上调用foo()方法时,这是Parent类的引用,那么我需要使用intanceof和多个if..else ,我想避免它。 Parent obj = …// Object of one of the child classes obj.foo(); 编辑:我需要使用obj类型作为Parent 。 否则我将无法调用父类中存在的obj上的方法。 我的解决方案:我想的方法是使用foo()方法定义一个接口说FooInterface并让所有子类实现它,然后我可以输入obj到该接口并调用foo()方法,如下所示: if(obj instanceof […]

在Java中,我可以在instanceof表达式中使用基本类型文字或类型变量吗?

我可以在instanceof表达式中使用基本类型文字或类型变量吗? class MyClass { { boolean b1 = null instanceof T; // T erasure -> Object should be used boolean b2 = 2 instanceof Integer; // Incompatible operands } 我收到了编译错误。 有没有办法绕过这些错误并在instanceof表达式中使用原始类型的文字/类型变量? 基本上,我想要放心,不,我永远无法做到这一点。

检查ArrayList以获取对象的实例

我有一个java方法,应该检查ArrayList并检查它是否包含给定类的实例。 我需要传递方法类型的类来检查作为参数,如果List包含给定类型的对象,则返回它。 这可以实现吗?

为什么getClass返回类的名称+ $ 1(或$ *)

我正在编写一段代码,如果它是某个类的实例,我必须转换它。 像往常一样,我使用instanceof来检查兼容性。 问题是从不满足检查,因为对象属于“奇怪”类。 例如; 当我在这个对象上调用方法getClass().getSimpleName() ,它返回类+ + $*的名称(例如ViewPart$1而不是ViewPart )。 这个$*是什么意思? 有解决方案还是解决方法?

缺少Class.isInstance()的GWT解决方法

我正在尝试在GWT中编写一个作业调度系统来维护一组exception( Class[] exceptions ),这可以通过重试作业来解决。 为此,如果调度程序捕获exception,我需要查看此exception是否与数组中的某个类匹配。 所以,我希望有这样的function: boolean offerRetry(Exception exception) { for (Class e: exceptions) if (e.isInstance(exception)) return true; return false; } 不幸的是, Class.isInstance(…)在GWT中不可用。 有一个很好的解决方案吗? 我目前最好的猜测是这样的: public static boolean isInstance(Class clazz, Object o) { if ((clazz==null) || (o==null)) return false; if (clazz.isInterface()) throw new UnsupportedOperationException(); Class oClazz = o.getClass(); while (oClazz!=null) { if (oClazz.equals(clazz)) return true; […]