jjzjj

MethodHandle

全部标签

Java代码编译成常量池中的MethodHandle

我正在尝试使用Java8Nashorn具有完整的源代码(未检测)。如您所知,它使用Nasgen修改.classes,输出在JRE/lib/ext/nashorn.jar中。在反汇编输出时,使用javap:0:aload_01:ldc#24//StringFunction3:ldc#31//MethodHandleinvokestaticjdk/nashorn/internal/objects/NativeFunction.function:(ZLjava/lang/Object;[Ljava/lang/Object;)Ljdk/nashorn/internal/runtime/Scri

java - 如何使用 MethodHandles.Lookup 查找数组构造函数 MethodHandle?

如何为像int[]::new这样的数组构造函数获取MethodHandle?这行不通:publicstaticvoidmain(String[]args)throwsThrowable{MethodHandles.Lookuplookup=MethodHandles.publicLookup();MethodHandlemh=lookup.findConstructor(int[].class,MethodType.methodType(void.class,int.class));System.out.println(mh);System.out.println(mh.invoke(

java - 具有泛型类型具体实现的 LambdaMetaFactory

我正在尝试使用Java的LambdaMetaFactory动态实现通用lambda,Handler:publicclassRoutingContext{//...}@FunctionalInterfacepublicinterfaceHandler{publicvoidhandle(Xarg);}publicclassHomeHandlerextendsHandler{@Overridepublicvoidhandle(RoutingContextctx){//...}}这是我对LambdaMetaFactory的尝试:try{ClasshomeHandlerClass=HomeHan

java/lang/NoClassDefFoundError : java/lang/invoke/MethodHandle eclipse juno 错误

我在MacOSX10.8.4上运行EclipseJuno,当我运行我的Java应用程序时,我试图将我的jdk更新到1.7,但出现此错误:ErroroccurredduringinitializationofVMjava/lang/NoClassDefFoundError:java/lang/invoke/MethodHandle如果我在终端上运行java-version我明白了javaversion"1.7.0_40"Java(TM)SERuntimeEnvironment(build1.7.0_40-b43)JavaHotSpot(TM)64-BitServerVM(build24.

java - 如何删除用作监听器的 lambda 表达式/方法句柄?

Java8引入了lambdaexpressions,这是一件好事。但现在考虑重写这段代码:classBimplementsPropertyChangeListener{voidlistenToA(Aa){a.addPropertyChangeListener(this);}voidpropertyChange(PropertyChangeEventevt){switch(evt.getPropertyName()){case"Property1":doSomething();break;case"Property2":doSomethingElse();case"Property1":

java - 如何使用 Object[] 数组调用 MethodHandle.invokeExact()?

Java的MethodHandle.invokeExact(Object...args)采用可变长度的参数列表。但是,当我尝试传递Object[]数组而不是列表时,出现错误。见下文:privatevoiddoIt()throwsThrowable{Methodmeth=Foo.class.getDeclaredMethods()[0];MethodHandles.Lookuplookup=MethodHandles.lookup();MethodHandlemh=lookup.unreflect(meth);Foofoo=newFoo();StringmyStr="aaa";Integ

java - MethodHandles 还是 LambdaMetafactory?

在我的工作中,我们有一个用于指定数学公式的DSL,我们后来将其应用于很多点(以百万计)。截至今天,我们构建了公式的AST,并访问每个节点以生成我们所谓的“评估器”。然后,我们将公式的参数传递给评估器,并针对每个点进行计算。例如,我们有这个公式:x*(3+y)┌────┐┌─────┤mult├─────┐│└────┘│││┌──v──┐┌──v──┐│x│┌───┤add├──┐└─────┘│└─────┘│││┌──v──┐┌──v──┐│3││y│└─────┘└─────┘我们的评估器将为每个步骤发出“评估”对象。这种方法编程容易,但效率不高。所以我开始研究方法句柄以构建一个

java.lang.NoSuchMethodError : VarHandle. compareAndSet(VariableHandlesExample,State,State)无效

VarHandle显示以下错误-Exceptioninthread"main"java.lang.NoSuchMethodError:VarHandle.compareAndSet(VarHandleExample,int,int)voidatjava.base/java.lang.invoke.MethodHandleNatives.newNoSuchMethodErrorOnVarHandle(MethodHandleNatives.java:492)atjava.base/java.lang.invoke.MethodHandleNatives.varHandleOperatio

java - 使用 java.lang.invoke.MethodHandle 调用私有(private)方法

如何使用方法句柄调用私有(private)方法?据我所知,只有两种可公开访问的Lookup实例:MethodHandles.lookup()MethodHandles.publicLookup()并且都不允许不受限制的私有(private)访问。有一个非公开的Lookup.IMPL_LOOKUP可以满足我的要求。是否有一些公共(public)方式来获取它(假设SecurityManager允许)? 最佳答案 事实证明,使用Lookup#unreflect(Method)并暂时使方法可访问是可能的(除非在程序初始化期间完成,否则可能会

java - 是否有可能使 java.lang.invoke.MethodHandle 与直接调用一样快?

我正在比较MethodHandle::invoke和直接静态方法调用的性能。这是静态方法:publicclassIntSum{publicstaticintsum(inta,intb){returna+b;}}这是我的基准:@State(Scope.Benchmark)publicclassMyBenchmark{publicintfirst;publicintsecond;publicfinalMethodHandlemhh;@Benchmark@OutputTimeUnit(TimeUnit.NANOSECONDS)@BenchmarkMode(Mode.AverageTime)p