// Path: src/main/java/cn/xdean/jex/lang/ExceptionUtil.java
// public class ExceptionUtil {
//   public static <T extends Throwable, R> R throwIt(T t) throws T {
//     throw t;
//   }
// 
//   @SuppressWarnings("unchecked")
//   public static <T extends Throwable, R> R throwAsUncheck(Throwable t) throws T {
//     throw (T) t;
//   }
// 
//   public static void uncheck(ActionE0<?> task) {
//     try {
//       task.call();
//     } catch (Exception t) {
//       throwAsUncheck(t);
//     }
//   }
// 
//   public static <T> T uncheck(FuncE0<T, ?> task) {
//     return supplierToRunnable(task, r -> uncheck(r));
//   }
// 
//   public static boolean uncatch(ActionE0<?> task) {
//     try {
//       task.call();
//       return true;
//     } catch (Exception t) {
//       LogFactory.from(ExceptionUtil.class).trace("Dont catch", t);
//       return false;
//     }
//   }
// 
//   /**
//    * @param task
//    * @return can be null
//    */
//   public static <T> T uncatch(FuncE0<T, ?> task) {
//     return supplierToRunnable(task, r -> uncatch(r));
//   }
// 
//   @SuppressWarnings("unchecked")
//   public static <E extends Exception> Optional<E> throwToReturn(ActionE0<E> task) {
//     try {
//       task.call();
//     } catch (Exception t) {
//       try {
//         return Optional.of((E) t);
//       } catch (ClassCastException cce) {
//         throw new RuntimeException("An unexcepted exception thrown.", t);
//       }
//     }
//     return Optional.empty();
//   }
// 
//   public static <T, E extends Exception> Either<T, E> throwToReturn(FuncE0<T, E> task) {
//     Wrapper<T> w = new Wrapper<>(null);
//     return Either.rightOrDefault(throwToReturn(() -> w.set(task.call())), w.get());
//   }
// 
//   public static String getStackTraceString(Throwable tr) {
//     if (tr == null) {
//       return "";
//     }
//     Throwable t = tr;
//     while (t.getCause() != null) {
//       t = t.getCause();
//     }
//     StringWriter sw = new StringWriter();
//     PrintWriter pw = new PrintWriter(sw);
//     t.printStackTrace(pw);
//     pw.flush();
//     return sw.toString();
//   }
// 
//   public static <E extends Exception> void wrapException(Function<Exception, E> wrapper, ActionE0<?> task)
//       throws E {
//     try {
//       task.call();
//     } catch (Exception e) {
//       throw wrapper.apply(e);
//     }
//   }
// 
//   public static <E extends Exception, T> T wrapException(Function<Exception, E> wrapper, FuncE0<T, ?> task)
//       throws E {
//     try {
//       return task.call();
//     } catch (Exception e) {
//       throw wrapper.apply(e);
//     }
//   }
// }


import cn.xdean.jex.lang.ExceptionUtil;
import java.lang.reflect.*;
import java.util.*;
import java.util.function.Function;
import java.util.function.UnaryOperator;
package cn.xdean.jex.reflect;



public class ReflectUtil {

  private static final UnaryOperator<Executable> EXECUTABLE_GET_ROOT;
  private static final Function<Class<?>, Method[]> CLASS_GET_ROOT_METHODS;
  private static final UnaryOperator<Field> FIELD_GET_ROOT;
  private static final Function<Class<?>, Field[]> CLASS_GET_ROOT_FIELDS;
  static {
    try {
      Method getRootMethod = Executable.class.getDeclaredMethod("getRoot");
      getRootMethod.setAccessible(true);
      EXECUTABLE_GET_ROOT = m -> ExceptionUtil.uncheck(() -> (Executable) getRootMethod.invoke(m));
      Method getRootMethods = Class.class.getDeclaredMethod("privateGetPublicMethods");
      getRootMethods.setAccessible(true);
// Path: src/main/java/cn/xdean/jex/lang/ExceptionUtil.java
// public class ExceptionUtil {
//   public static <T extends Throwable, R> R throwIt(T t) throws T {
//     throw t;
//   }
// 
//   @SuppressWarnings("unchecked")
//   public static <T extends Throwable, R> R throwAsUncheck(Throwable t) throws T {
//     throw (T) t;
//   }
// 
//   public static void uncheck(ActionE0<?> task) {
//     try {
//       task.call();
//     } catch (Exception t) {
//       throwAsUncheck(t);
//     }
//   }
// 
//   public static <T> T uncheck(FuncE0<T, ?> task) {
//     return supplierToRunnable(task, r -> uncheck(r));
//   }
// 
//   public static boolean uncatch(ActionE0<?> task) {
//     try {
//       task.call();
//       return true;
//     } catch (Exception t) {
//       LogFactory.from(ExceptionUtil.class).trace("Dont catch", t);
//       return false;
//     }
//   }
// 
//   /**
//    * @param task
//    * @return can be null
//    */
//   public static <T> T uncatch(FuncE0<T, ?> task) {
//     return supplierToRunnable(task, r -> uncatch(r));
//   }
// 
//   @SuppressWarnings("unchecked")
//   public static <E extends Exception> Optional<E> throwToReturn(ActionE0<E> task) {
//     try {
//       task.call();
//     } catch (Exception t) {
//       try {
//         return Optional.of((E) t);
//       } catch (ClassCastException cce) {
//         throw new RuntimeException("An unexcepted exception thrown.", t);
//       }
//     }
//     return Optional.empty();
//   }
// 
//   public static <T, E extends Exception> Either<T, E> throwToReturn(FuncE0<T, E> task) {
//     Wrapper<T> w = new Wrapper<>(null);
//     return Either.rightOrDefault(throwToReturn(() -> w.set(task.call())), w.get());
//   }
// 
//   public static String getStackTraceString(Throwable tr) {
//     if (tr == null) {
//       return "";
//     }
//     Throwable t = tr;
//     while (t.getCause() != null) {
//       t = t.getCause();
//     }
//     StringWriter sw = new StringWriter();
//     PrintWriter pw = new PrintWriter(sw);
//     t.printStackTrace(pw);
//     pw.flush();
//     return sw.toString();
//   }
// 
//   public static <E extends Exception> void wrapException(Function<Exception, E> wrapper, ActionE0<?> task)
//       throws E {
//     try {
//       task.call();
//     } catch (Exception e) {
//       throw wrapper.apply(e);
//     }
//   }
// 
//   public static <E extends Exception, T> T wrapException(Function<Exception, E> wrapper, FuncE0<T, ?> task)
//       throws E {
//     try {
//       return task.call();
//     } catch (Exception e) {
//       throw wrapper.apply(e);
//     }
//   }
// }


// Path: src/main/java/cn/xdean/jex/reflect/ReflectUtil.java
import cn.xdean.jex.lang.ExceptionUtil;
import java.lang.reflect.*;
import java.util.*;
import java.util.function.Function;
import java.util.function.UnaryOperator;

package cn.xdean.jex.reflect;



public class ReflectUtil {

  private static final UnaryOperator<Executable> EXECUTABLE_GET_ROOT;
  private static final Function<Class<?>, Method[]> CLASS_GET_ROOT_METHODS;
  private static final UnaryOperator<Field> FIELD_GET_ROOT;
  private static final Function<Class<?>, Field[]> CLASS_GET_ROOT_FIELDS;
  static {
    try {
      Method getRootMethod = Executable.class.getDeclaredMethod("getRoot");
      getRootMethod.setAccessible(true);
      EXECUTABLE_GET_ROOT = m -> ExceptionUtil.uncheck(() -> (Executable) getRootMethod.invoke(m));
      Method getRootMethods = Class.class.getDeclaredMethod("privateGetPublicMethods");
      getRootMethods.setAccessible(true);
      CLASS_GET_ROOT_METHODS = c -> ExceptionUtil.uncheck(() -> (Method[]) getRootMethods.invoke(c));