How to filter results of a virtual method?
Jim Laskey
jlaskey at me.com
Wed Jan 26 09:17:54 PST 2011
A non-text attachment was scrubbed...
Name: TestFilter.java
Type: application/octet-stream
Size: 1459 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20110126/0da42fce/attachment.obj
-------------- next part --------------
Is there a way to filter the result of a virtual method? Seems okay for statics, but receiver runs interference on virtual calls.
Running the enclosed I get;
10.0
java.lang.IllegalArgumentException: target and combiner types must match: (TestFilter,int)double != (TestFilter)int
at sun.dyn.MemberName.newIllegalArgumentException(MemberName.java:513)
at java.dyn.MethodHandles.misMatchedTypes(MethodHandles.java:1706)
at java.dyn.MethodHandles.foldArguments(MethodHandles.java:1646)
at java.dyn.MethodHandles.filterReturnValue(MethodHandles.java:1588)
at TestFilter.main(TestFilter.java:29)
Source:;
import java.dyn.*;
public class TestFilter {
public static int a = 10;
public int b = 10;
public static double filter(int x) {
return (double)x;
}
public static void main(String[] args) {
try {
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle getter = lookup.findStaticGetter(TestFilter.class, "a", int.class);
MethodHandle filter = lookup.findStatic(TestFilter.class, "filter", MethodType.methodType(double.class, int.class));
MethodHandle filteredGetter = MethodHandles.filterReturnValue(getter, filter);
Object result = filteredGetter.invokeWithArguments();
System.out.println(result);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
try {
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle getter = lookup.findGetter(TestFilter.class, "b", int.class);
MethodHandle filter = lookup.findStatic(TestFilter.class, "filter", MethodType.methodType(double.class, int.class));
MethodHandle filteredGetter = MethodHandles.filterReturnValue(getter, filter);
TestFilter m = new TestFilter();
Object result = filteredGetter.invokeWithArguments();
System.out.println(result);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
More information about the mlvm-dev
mailing list