All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.gwt.reflect.shared.GwtReflectJre Maven / Gradle / Ivy

The newest version!
package com.google.gwt.reflect.shared;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;

public final class GwtReflectJre {

  public static Package getPackage(final String name) {
    return getPackage(name, Thread.currentThread().getContextClassLoader());
  }

  public static Package getPackage(final String name, final ClassLoader cl) {
    Package pkg = Package.getPackage(name);
    if (pkg == null) {
      final String pkgInfo = name.replace('.', '/')+"/package-info.class";
      final URL loc = Thread.currentThread().getContextClassLoader().getResource(pkgInfo);
      if (loc != null) {
        try {
          cl.loadClass(name+".package-info");
          pkg = Package.getPackage(name);
        } catch (final ClassNotFoundException ignored) {}
      }
    }
    return pkg;
  }

  /**
   * @param method
   * @param params
   * @return
   * @throws Throwable
   */
  public static Object invokeDefaultMethod(final Method method, final Object[] params) throws Throwable {
    final Object t=  java.lang.reflect.Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
        new Class[]{method.getDeclaringClass()},new java.lang.reflect.InvocationHandler() {
      @Override
      public Object invoke(final Object proxy, final Method method, final Object[] args)
          throws Throwable {
        return null;
      }
    });

    final Field field = java.lang.invoke.MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP");
    field.setAccessible(true);
    final java.lang.invoke.MethodHandles.Lookup lookup = (java.lang.invoke.MethodHandles.Lookup) field.get(null);
    final Object value = lookup
        .unreflectSpecial(method, method.getDeclaringClass())
        .bindTo(t)
        .invokeWithArguments();
    return value;
  }

  @SuppressWarnings("unchecked")
  public static  T[] newArray(final Class classLit, final int size) {
    return (T[])Array.newInstance(classLit, size);
  }


  @SuppressWarnings("unchecked")
  public static  T[][] newArray(final Class classLit, final int dim1, final int dim2) {
    return (T[][])Array.newInstance(classLit, dim1, dim2);
  }

  private GwtReflectJre() {}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy