package com.luo.dubbo.util;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class ReflectUtils {
/**
* void(V).
*/
public static final char JVM_VOID = 'V';
/**
* boolean(Z).
*/
public static final char JVM_BOOLEAN = 'Z';
/**
* byte(B).
*/
public static final char JVM_BYTE = 'B';
/**
* char(C).
*/
public static final char JVM_CHAR = 'C';
/**
* double(D).
*/
public static final char JVM_DOUBLE = 'D';
/**
* float(F).
*/
public static final char JVM_FLOAT = 'F';
/**
* int(I).
*/
public static final char JVM_INT = 'I';
/**
* long(J).
*/
public static final char JVM_LONG = 'J';
/**
* short(S).
*/
public static final char JVM_SHORT = 'S';
public static String getName(Class<?> c) {
if (c.isArray()) {
StringBuilder sb = new StringBuilder();
do {
sb.append("[]");
c = c.getComponentType();
} while (c.isArray());
return c.getName() + sb.toString();
}
return c.getName();
}
public static String getDescWithoutMethodName(Method m) {
StringBuilder ret = new StringBuilder();
ret.append('(');
Class<?>[] parameterTypes = m.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++)
ret.append(getDesc(parameterTypes[i]));
ret.append(')').append(getDesc(m.getReturnType()));
return ret.toString();
}
public static String getDesc(Class<?> c) {
StringBuilder ret = new StringBuilder();
while (c.isArray()) {
ret.append('[');
c = c.getComponentType();
}
if (c.isPrimitive()) {
String t = c.getName();
if ("void".equals(t))
ret.append(JVM_VOID);
else if ("boolean".equals(t))
ret.append(JVM_BOOLEAN);
else if ("byte".equals(t))
ret.append(JVM_BYTE);
else if ("char".equals(t))
ret.append(JVM_CHAR);
else if ("double".equals(t))
ret.append(JVM_DOUBLE);
else if ("float".equals(t))
ret.append(JVM_FLOAT);
else if ("int".equals(t))
ret.append(JVM_INT);
else if ("long".equals(t))
ret.append(JVM_LONG);
else if ("short".equals(t))
ret.append(JVM_SHORT);
} else {
ret.append('L');
ret.append(c.getName().replace('.', '/'));
ret.append(';');
}
return ret.toString();
}
public static String getDesc(final Constructor<?> c) {
StringBuilder ret = new StringBuilder("(");
Class<?>[] parameterTypes = c.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++)
ret.append(getDesc(parameterTypes[i]));
ret.append(')').append('V');
return ret.toString();
}
/***
* 获取 非静态,公有方法
*
* @param clazz
* @return
* @author HadLuo 2017年11月20日 新建
*/
public static List<Method> getPublicMethod(Class<?> clazz) {
List<Method> ms = new ArrayList<Method>();
for (Method m : clazz.getMethods()) {
if (!Modifier.isStatic(m.getModifiers()) && Modifier.isPublic(m.getModifiers())) {
ms.add(m);
}
}
return ms;
}
/***
* 执行方法
*
* @param target
* @param method
* @param args
* @author HadLuo 2017年10月25日 新建
*/
public static Object invoke(Object target, Method method, Object... args) {
try {
return method.invoke(target, args);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/***
* 判断 a是否是 b的 子类
*
* @param a
* @param b
* @return
* @author HadLuo 2017年10月24日 新建
*/
public static boolean isChild(Class<?> a, Class<?> b) {
return b.isAssignableFrom(a);
}
/***
* 获取 此类,及其超类的 所有字段
*
* @return
* @author HadLuo 2017年10月25日 新建
*/
public static List<Field> getAllFields(Class<?> clazz) {
List<Field> fieldList = new ArrayList<Field>();
while (clazz != null) {// 当父类为null的时候说明到达了最上层的父类(Object类).
fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass(); // 得到父类,然后赋给自己
}
return fieldList;
}
/***
* 获取 此类,及其超类的 所有字段
*
* @return
* @author HadLuo 2017年10月25日 新建
*/
public static List<Field> getAllFieldsByAnnotation(Class<?> clazz,
Class<? extends Annotation> annotationClass) {
List<Field> fieldList = new ArrayList<Field>();
while (clazz != null) {// 当父类为null的时候说明到达了最上层的父类(Object类).
for (Field f : clazz.getDeclaredFields()) {
if (f.isAnnotationPresent(annotationClass)) {
fieldList.add(f);
}
}
clazz = clazz.getSuperclass(); // 得到父类,然后赋给自己
}
return fieldList;
}
/***
* 获取 此类及其超类 有 对应注解 的字段
*
* @return
* @author HadLuo 2017年10月25日 新建
*/
public static Annotation getFieldAnnotation(Class<?> clazz, Class<? extends Annotation> annotationClass) {
while (clazz != null) {// 当父类为null的时候说明到达了最上层的父类(Object类).
for (Field f : clazz.getDeclaredFields()) {
if (f.isAnnotationPresent(annotationClass)) {
return f.getAnnotation(annotationClass);
}
}
clazz = clazz.getSuperclass(); // 得到父类,然后赋给自己
}
return null;
}
/***
* 获取 此类,及其超类的 所有方法
*
* @return
* @author HadLuo 2017年10月25日 新建
*/
public static Method getMethod(Class<?> clazz, String name, Class<?>... parameterTypes) {
Method m = null;
while (clazz != null) {// 当父类为null的时候说明到达了最上层的父类(Object类).
try {
m = clazz.getDeclaredMethod(name, parameterTypes);
} catch (Exception e) {
// TODO
e.printStackTrace();
throw new RuntimeException(e);
}
if (m != null) {
break;
}
clazz = clazz.getSuperclass(); // 得到父类,然后赋给自己
}