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();
        }
    }

}
