public static MethodHandle findMethod(Class<?> callerClass, String name, MethodType type) {
		if (StrUtil.isBlank(name)) {
			return findConstructor(callerClass, type);
		}

		MethodHandle handle = null;
		final MethodHandles.Lookup lookup = lookup(callerClass);
		try {
			handle = lookup.findVirtual(callerClass, name, type);
		} catch (IllegalAccessException | NoSuchMethodException ignore) {
			//ignore
		}

		// static方法
		if (null == handle) {
			try {
				handle = lookup.findStatic(callerClass, name, type);
			} catch (IllegalAccessException | NoSuchMethodException ignore) {
				//ignore
			}
		}

		// 特殊方法，包括构造方法、私有方法等
		if (null == handle) {
			try {
				handle = lookup.findSpecial(callerClass, name, type, callerClass);
			} catch (NoSuchMethodException ignore) {
				//ignore
			} catch (IllegalAccessException e) {
				throw new UtilException(e);
			}
		}

		return handle;
	}
@Test
	public void findMethodTest() throws Throwable {
		MethodHandle handle = MethodHandleUtil.findMethod(Duck.class, "quack",
				MethodType.methodType(String.class));
		assertNotNull(handle);
		// 对象方法自行需要绑定对象或者传入对象参数
		String invoke = (String) handle.invoke(new BigDuck());
		assertEquals("Quack", invoke);

		// 对象的方法获取
		handle = MethodHandleUtil.findMethod(BigDuck.class, "getSize",
				MethodType.methodType(int.class));
		assertNotNull(handle);
		int invokeInt = (int) handle.invoke(new BigDuck());
		assertEquals(36, invokeInt);
	}