没写完。。。有兴趣的可以补充。
package cn.bisoft.java.deep;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* 反射工具类.
*
* @author tangliang
*
*/
@SuppressWarnings("rawtypes")
public class ReflectUtil {
private ReflectUtil() {
}
/**
* 获取所有构造方法.
*
* @param clz
* @return Set<Constructor>
*/
public static Set<Constructor> getConstructors(Class<?> clz) {
Set<Constructor> constructors = new HashSet<Constructor>();
constructors.addAll(Arrays.asList(clz.getConstructors()));
constructors.addAll(Arrays.asList(clz.getDeclaredConstructors()));
return constructors;
}
/**
* 获取本类或接口的所有方法.
*
* @param clz
* @return Set<Method>
*/
public static Set<Method> getMethods(Class<?> clz) {
Set<Method> methods = new HashSet<Method>();
methods.addAll(Arrays.asList(clz.getMethods()));
methods.addAll(Arrays.asList(clz.getDeclaredMethods()));
return methods;
}
/**
* 获取类所有接口和父类.
*
* @param clz
* @return Set<Class>
*/
public static Set<Class> getClasses(Class<?> clz) {
Set<Class> classes = new HashSet<Class>();
Class<?>[] interfaces = clz.getInterfaces();
Class<?> superClass = clz.getSuperclass();
classes.addAll(Arrays.asList(interfaces));
classes.add(superClass);
return classes;
}
/**
* 获取本类或接口的所有方法和继承、实现方法, 但不包括构造方法.
*
* @param clz
* @return Set<Method>
*/
public static Set<Method> getAllMethods(Class<?> clz) {
Set<Class> classes = getClasses(clz);
Set<Method> methods = getMethods(clz);
for (Class clazz : classes) {
methods.addAll(getMethods(clazz));
}
return methods;
}
/**
* 快速创建任何对象.
*
* @param className
* @return Object
*/
public static Object newInstance(String className) {
try {
Constructor constructor = getNoParamsConstructor(getContextClassLoader()
.loadClass(className));
constructor.setAccessible(true);
return constructor.newInstance((Object[]) null);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 当前线程类加载器
*
* @return ClassLoader
*/
public static ClassLoader getContextClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
/**
* CLASSPATH 类加载器
*
* @return ClassLoader
*/
public static ClassLoader getSystemClassLoader() {
return ClassLoader.getSystemClassLoader();
}
/**
* 获取无参构造方法.
*
* @param clz
* @return ClassLoader
*/
public static Constructor getNoParamsConstructor(Class<?> clz) {
for (Constructor constructor : getConstructors(clz)) {
if (0 == constructor.getParameterTypes().length) {
return constructor;
}
}
return null;
}
// *********** BEGIN TEST *****************
public static void main(String[] args) {
Set<Method> methods = ReflectUtil.getAllMethods(ReflectUtil.class);
for (Method method : methods) {
System.out.println(method.getDeclaringClass().getName() + " | "
+ method.getName() + " | "
+ method.getParameterTypes().length);
}
}
// *********** END TEST *****************
}