java - MethodHandle 可以被框架/库使用(而不是传统的反射)吗?

标签 java reflection methodhandle

在我的框架中我有一个这样的类:

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)

即使 beanPerson 的实例。现在误导的部分是它试图将 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/

相关文章:

java - 短信收件箱 Android 4.4

java - 如何根据 Android 手机的分辨率将 PNG 文件定义为可绘制对象调整大小?

java - 使用 Java Reflections 检索成员类

java - MethodHandle - 这是什么?

java - 在 Java 中使用 FTP 并检测断开连接

java - 使用线程处理套接字

c# - 通过在任何类之外声明的反射访问委托(delegate)?

c# - 使用 C# 反射将可变大小的集合分配给类属性

java - 我如何找出 lambda 适用于哪种方法?

java - Android NoSuchMethodError : No virtual method invoke in MethodHandle,