org.xmlbeam.util.intern.ReflectionHelper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xmlprojector Show documentation
Show all versions of xmlprojector Show documentation
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.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
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 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");
/**
* @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;
}
/**
*
* @param a
* @return a set of all super interfaces of a
*/
public static Set> findAllSuperInterfaces(final Class> a) {
final Set> set = new LinkedHashSet>();
if (a.isInterface()) {
set.add(a);
}
for (final Class> i : a.getInterfaces()) {
set.addAll(findAllSuperInterfaces(i));
}
return set;
};
/**
* 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