Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
The coolest XML library for Java around. Define typesafe views (projections) to xml. Use XPath to read and write XML. Bind XML to Java collections. Requires at least Java6, supports Java8 features and has no further runtime dependencies.
/**
* Copyright 2013 Sven Ewald
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xmlbeam.util.intern;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.regex.Pattern;
/**
* A set of tiny helper methods internally used in the projection framework. This methods are
* not part of the public framework API and might change in minor version updates.
*
* @author Sven Ewald
*/
public final class ReflectionHelper {
private final static Method ISDEFAULT = findMethodByName(Method.class, "isDefault");
private final static Class> OPTIONAL_CLASS = findOptionalClass();
private final static Method OFNULLABLE = (OPTIONAL_CLASS == null) ? null : findMethodByName(OPTIONAL_CLASS, "ofNullable");
private final static Method GETPARAMETERS = findMethodByName(Method.class, "getParameters");
private final static int PUBLIC_STATIC_MODIFIER = Modifier.STATIC | Modifier.PUBLIC;
private final static Pattern VALID_FACTORY_METHOD_NAMES = Pattern.compile("valueOf|of|parse|getInstance");
private static Class> findOptionalClass() {
try {
return Class.forName("java.util.Optional", false, ReflectionHelper.class.getClassLoader());
} catch (ClassNotFoundException e) {
return null;
}
}
/**
* @param a
* @param b
* @return a set of all interfaces that a extends and b extends
*/
public static Set> findAllCommonSuperInterfaces(final Class> a, final Class> b) {
final Set> seta = new HashSet>(findAllSuperInterfaces(a));
final Set> setb = new HashSet>(findAllSuperInterfaces(b));
seta.retainAll(setb);
return seta;
}
/**
* Non exception throwing shortcut to find the first method with a given name.
*
* @param clazz
* @param name
* @return method with name "name" or null if it does not exist.
*/
public static Method findMethodByName(final Class> clazz, final String name) {
for (final Method m : clazz.getMethods()) {
if (name.equals(m.getName())) {
return m;
}
}
return null;
}
/**
* Non exception throwing shortcut to find the first method with a given name and parameter
* types.
*
* @param clazz
* @param name
* @param paramTypes
* @return method with name "name" and parameters or null if it does not exist.
*/
public static Method findMethodByNameAndParams(final Class> clazz, final String name, final Class>[] paramTypes) {
for (final Method m : clazz.getMethods()) {
if (!name.equals(m.getName())) {
continue;
}
if (!Arrays.equals(m.getParameterTypes(), paramTypes)) {
continue;
}
return m;
}
return null;
}
/**
* Returns list of super interfaces,sorted from the top (super) to the bottom (extended).
*
* @param a
* @return a set of all super interfaces of a
*/
public static List> findAllSuperInterfaces(final Class> a) {
LinkedList> list = new LinkedList>();
Queue> queue = new LinkedList>();
queue.add(a);
while (!queue.isEmpty()) {
Class> c = queue.poll();
if (c.isInterface()) {
list.addFirst(c);
}
queue.addAll(Arrays.asList(c.getInterfaces()));
}
return list;
};
/**
* @param c
* @return list of all extended classes and implemented interfaces
*/
public static List> findAllSuperClasses(final Class> c) {
if (c == null) {
return Collections.emptyList();
}
if (c.isInterface()) {
return new LinkedList>(findAllSuperInterfaces(c));
}
LinkedList> superclasses = new LinkedList>(findAllSuperClasses(c.getSuperclass()));
superclasses.addFirst(c);
return superclasses;
}
/**
* Defensive implemented method to determine if method has a return type.
*
* @param method
* @return true if and only if it is not a void method.
*/
public static boolean hasReturnType(final Method method) {
if (method == null) {
return false;
}
if (method.getReturnType() == null) {
return false;
}
if (Void.class.equals(method.getReturnType())) {
return false;
}
return !Void.TYPE.equals(method.getReturnType());
}
/**
* @param method
* @return true if and only if the method has at least one parameter.
*/
public static boolean hasParameters(final Method method) {
return (method != null) && (method.getParameterTypes().length > 0);
}
/**
* @param method
* @param projectionInterface
* @return lowest type in hierarchy that defines the given method
*/
public static Class> findDeclaringInterface(final Method method, final Class> projectionInterface) {
for (final Class> interf : findAllSuperInterfaces(projectionInterface)) {
if (declaresMethod(interf, method)) {
return interf;
}
}
return method.getDeclaringClass();
}
/**
* @param interf
* @param method
* @return
*/
private static boolean declaresMethod(final Class> interf, final Method method) {
for (final Method m : interf.getDeclaredMethods()) {
if (!m.getName().equals(method.getName())) {
continue;
}
if (!Arrays.equals(m.getParameterTypes(), method.getParameterTypes())) {
continue;
}
return true;
}
return false;
}
/**
* Same as Arrays.asList(...), but does automatically conversion of primitive arrays.
*
* @param array
* @return List of objects representing the given array contents
*/
public static List