/** * Copyright (c) 2012-2016 André Bargull * Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms. * * <https://github.com/anba/es6draft> */ package com.github.anba.es6draft.runtime.internal; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; /** * Wrapper class for {@link MethodHandles.Lookup}. */ public final class MethodLookup { private final MethodHandles.Lookup lookup; /** * Constructs a new instance. * * @param lookup * the lookup object */ public MethodLookup(MethodHandles.Lookup lookup) { this.lookup = lookup; } /** * Returns wrapped the lookup object. * * @return the lookup object */ public MethodHandles.Lookup getLookup() { return lookup; } /** * Returns a method handle for a static method. * * @param name * the method name * @param type * the method type * @return method handle for a static method */ public MethodHandle findStatic(String name, MethodType type) { return findStatic(lookup, lookup.lookupClass(), name, type); } /** * Returns a method handle for a static method. * * @param clazz * the reference class * @param name * the method name * @param type * the method type * @return method handle for a static method */ public MethodHandle findStatic(Class<?> clazz, String name, MethodType type) { return findStatic(lookup, clazz, name, type); } /** * Returns a method handle for a static method. * * @param lookup * the lookup object * @param name * the method name * @param type * the method type * @return method handle for a static method */ public static MethodHandle findStatic(MethodHandles.Lookup lookup, String name, MethodType type) { return findStatic(lookup, lookup.lookupClass(), name, type); } /** * Returns a method handle for a static method. * * @param lookup * the lookup object * @param clazz * the reference class * @param name * the method name * @param type * the method type * @return method handle for a static method */ public static MethodHandle findStatic(MethodHandles.Lookup lookup, Class<?> clazz, String name, MethodType type) { try { return lookup.findStatic(clazz, name, type); } catch (NoSuchMethodException | IllegalAccessException e) { throw new IllegalStateException(e); } } /** * Returns a method handle for a virtual method. * * @param name * the method name * @param type * the method type * @return method handle for a virtual method */ public MethodHandle findVirtual(String name, MethodType type) { return findVirtual(lookup, lookup.lookupClass(), name, type); } /** * Returns a method handle for a virtual method. * * @param clazz * the reference class * @param name * the method name * @param type * the method type * @return method handle for a virtual method */ public MethodHandle findVirtual(Class<?> clazz, String name, MethodType type) { return findVirtual(lookup, clazz, name, type); } /** * Returns a method handle for a virtual method. * * @param lookup * the lookup object * @param name * the method name * @param type * the method type * @return method handle for a virtual method */ public static MethodHandle findVirtual(MethodHandles.Lookup lookup, String name, MethodType type) { return findVirtual(lookup, lookup.lookupClass(), name, type); } /** * Returns a method handle for a virtual method. * * @param lookup * the lookup object * @param clazz * the reference class * @param name * the method name * @param type * the method type * @return method handle for a virtual method */ public static MethodHandle findVirtual(MethodHandles.Lookup lookup, Class<?> clazz, String name, MethodType type) { try { return lookup.findVirtual(clazz, name, type); } catch (NoSuchMethodException | IllegalAccessException e) { throw new IllegalStateException(e); } } }