在我的框架中我有一个这样的类:
public class Foo<B, V> {
private final Method getterMethod;
...
public V executeGetter(B bean) {
try {
return getterMethod.invoke(bean);
} catch ...
}
}
此类用于调用用户创建的类的 getter,这些类在我的框架编译时不可用。例如,B
可能是一个名为 Person
的类。
通过分析,我发现这种方法非常慢。 Method.invoke()
在采样分析中占用 40% 的性能(即使使用 setAccessible(true)
),而非反射实现只占用该性能的一小部分.
所以我想用 MethodHandle
替换 is:
public class Foo<B, V> {
private final MethodHandle getterMethodHandle;
...
public V executeGetter(B bean) {
try {
return getterMethodHandle.invoke(bean);
} catch ...
}
}
但是我得到了这个异常:
java.lang.ClassCastException: Cannot cast [Ljava.lang.Object; to Person
at sun.invoke.util.ValueConversions.newClassCastException(ValueConversions.java:461)
at sun.invoke.util.ValueConversions.castReference(ValueConversions.java:456)
at ...Foo.executeGetter(Foo.java:123)
即使 bean
是 Person
的实例。现在误导的部分是它试图将 Object[]
(而不是 Object
)转换为 Person
。请注意,将它包装在一个对象数组中(这是一种性能损失)没有帮助:
return getterMethodHandle.invoke(new Object[]{bean}); // Same exception
是否有可能让 MethodHandle
在这种情况下工作?
最佳答案
ClassCastException
只有在使用源/目标级别 java 6 编译时才会发生。
使用 7 级或更高级别的源/目标进行编译以避免 ClassCastException
。
感谢 Tagir 的回答找到了答案。 (也为他的答案投票)
关于java - MethodHandle 可以被框架/库使用(而不是传统的反射)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34046844/