📄 introspectionutils.java
字号:
String cpathProp, boolean addTools) throws IOException,
MalformedURLException {
Vector jarsV = new Vector();
if (dir != null) {
// Add dir/classes first, if it exists
URL url = getURL(dir, "classes");
if (url != null)
jarsV.addElement(url);
addToClassPath(jarsV, dir);
}
if (cpath != null)
addJarsFromClassPath(jarsV, cpath);
if (cpathProp != null) {
String cpath1 = System.getProperty(cpathProp);
addJarsFromClassPath(jarsV, cpath1);
}
if (addTools)
addToolsJar(jarsV);
return getClassPath(jarsV);
}
// -------------------- Mapping command line params to setters
public static boolean processArgs(Object proxy, String args[])
throws Exception {
String args0[] = null;
if (null != findMethod(proxy.getClass(), "getOptions1", new Class[] {})) {
args0 = (String[]) callMethod0(proxy, "getOptions1");
}
if (args0 == null) {
//args0=findVoidSetters(proxy.getClass());
args0 = findBooleanSetters(proxy.getClass());
}
Hashtable h = null;
if (null != findMethod(proxy.getClass(), "getOptionAliases",
new Class[] {})) {
h = (Hashtable) callMethod0(proxy, "getOptionAliases");
}
return processArgs(proxy, args, args0, null, h);
}
public static boolean processArgs(Object proxy, String args[],
String args0[], String args1[], Hashtable aliases) throws Exception {
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.startsWith("-"))
arg = arg.substring(1);
if (aliases != null && aliases.get(arg) != null)
arg = (String) aliases.get(arg);
if (args0 != null) {
boolean set = false;
for (int j = 0; j < args0.length; j++) {
if (args0[j].equalsIgnoreCase(arg)) {
setProperty(proxy, args0[j], "true");
set = true;
break;
}
}
if (set)
continue;
}
if (args1 != null) {
for (int j = 0; j < args1.length; j++) {
if (args1[j].equalsIgnoreCase(arg)) {
i++;
if (i >= args.length)
return false;
setProperty(proxy, arg, args[i]);
break;
}
}
} else {
// if args1 is not specified,assume all other options have param
i++;
if (i >= args.length)
return false;
setProperty(proxy, arg, args[i]);
}
}
return true;
}
// -------------------- other utils --------------------
public static void clear() {
objectMethods.clear();
}
public static String[] findVoidSetters(Class c) {
Method m[] = findMethods(c);
if (m == null)
return null;
Vector v = new Vector();
for (int i = 0; i < m.length; i++) {
if (m[i].getName().startsWith("set")
&& m[i].getParameterTypes().length == 0) {
String arg = m[i].getName().substring(3);
v.addElement(unCapitalize(arg));
}
}
String s[] = new String[v.size()];
for (int i = 0; i < s.length; i++) {
s[i] = (String) v.elementAt(i);
}
return s;
}
public static String[] findBooleanSetters(Class c) {
Method m[] = findMethods(c);
if (m == null)
return null;
Vector v = new Vector();
for (int i = 0; i < m.length; i++) {
if (m[i].getName().startsWith("set")
&& m[i].getParameterTypes().length == 1
&& "boolean".equalsIgnoreCase(m[i].getParameterTypes()[0]
.getName())) {
String arg = m[i].getName().substring(3);
v.addElement(unCapitalize(arg));
}
}
String s[] = new String[v.size()];
for (int i = 0; i < s.length; i++) {
s[i] = (String) v.elementAt(i);
}
return s;
}
static Hashtable objectMethods = new Hashtable();
public static Method[] findMethods(Class c) {
Method methods[] = (Method[]) objectMethods.get(c);
if (methods != null)
return methods;
methods = c.getMethods();
objectMethods.put(c, methods);
return methods;
}
public static Method findMethod(Class c, String name, Class params[]) {
Method methods[] = findMethods(c);
if (methods == null)
return null;
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals(name)) {
Class methodParams[] = methods[i].getParameterTypes();
if (methodParams == null)
if (params == null || params.length == 0)
return methods[i];
if (params == null)
if (methodParams == null || methodParams.length == 0)
return methods[i];
if (params.length != methodParams.length)
continue;
boolean found = true;
for (int j = 0; j < params.length; j++) {
if (params[j] != methodParams[j]) {
found = false;
break;
}
}
if (found)
return methods[i];
}
}
return null;
}
/** Test if the object implements a particular
* method
*/
public static boolean hasHook(Object obj, String methodN) {
try {
Method myMethods[] = findMethods(obj.getClass());
for (int i = 0; i < myMethods.length; i++) {
if (methodN.equals(myMethods[i].getName())) {
// check if it's overriden
Class declaring = myMethods[i].getDeclaringClass();
Class parentOfDeclaring = declaring.getSuperclass();
// this works only if the base class doesn't extend
// another class.
// if the method is declared in a top level class
// like BaseInterceptor parent is Object, otherwise
// parent is BaseInterceptor or an intermediate class
if (!"java.lang.Object".equals(parentOfDeclaring.getName())) {
return true;
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
public static void callMain(Class c, String args[]) throws Exception {
Class p[] = new Class[1];
p[0] = args.getClass();
Method m = c.getMethod("main", p);
m.invoke(c, new Object[] { args });
}
public static Object callMethod1(Object target, String methodN,
Object param1, String typeParam1, ClassLoader cl) throws Exception {
if (target == null || param1 == null) {
d("Assert: Illegal params " + target + " " + param1);
}
if (dbg > 0)
d("callMethod1 " + target.getClass().getName() + " "
+ param1.getClass().getName() + " " + typeParam1);
Class params[] = new Class[1];
if (typeParam1 == null)
params[0] = param1.getClass();
else
params[0] = cl.loadClass(typeParam1);
Method m = findMethod(target.getClass(), methodN, params);
if (m == null)
throw new NoSuchMethodException(target.getClass().getName() + " "
+ methodN);
return m.invoke(target, new Object[] { param1 });
}
public static Object callMethod0(Object target, String methodN)
throws Exception {
if (target == null) {
d("Assert: Illegal params " + target);
return null;
}
if (dbg > 0)
d("callMethod0 " + target.getClass().getName() + "." + methodN);
Class params[] = new Class[0];
Method m = findMethod(target.getClass(), methodN, params);
if (m == null)
throw new NoSuchMethodException(target.getClass().getName() + " "
+ methodN);
return m.invoke(target, emptyArray);
}
static Object[] emptyArray = new Object[] {};
public static Object callMethodN(Object target, String methodN,
Object params[], Class typeParams[]) throws Exception {
Method m = null;
m = findMethod(target.getClass(), methodN, typeParams);
if (m == null) {
d("Can't find method " + methodN + " in " + target + " CLASS "
+ target.getClass());
return null;
}
Object o = m.invoke(target, params);
if (dbg > 0) {
// debug
StringBuffer sb = new StringBuffer();
sb.append("" + target.getClass().getName() + "." + methodN + "( ");
for (int i = 0; i < params.length; i++) {
if (i > 0)
sb.append(", ");
sb.append(params[i]);
}
sb.append(")");
d(sb.toString());
}
return o;
}
public static Object convert(String object, Class paramType) {
Object result = null;
if ("java.lang.String".equals(paramType.getName())) {
result = object;
} else if ("java.lang.Integer".equals(paramType.getName())
|| "int".equals(paramType.getName())) {
try {
result = new Integer(object);
} catch (NumberFormatException ex) {
}
// Try a setFoo ( boolean )
} else if ("java.lang.Boolean".equals(paramType.getName())
|| "boolean".equals(paramType.getName())) {
result = new Boolean(object);
// Try a setFoo ( InetAddress )
} else if ("java.net.InetAddress".equals(paramType
.getName())) {
try {
result = InetAddress.getByName(object);
} catch (UnknownHostException exc) {
d("Unable to resolve host name:" + object);
}
// Unknown type
} else {
d("Unknown type " + paramType.getName());
}
if (result == null) {
throw new IllegalArgumentException("Can't convert argument: " + object);
}
return result;
}
// -------------------- Get property --------------------
// This provides a layer of abstraction
public static interface PropertySource {
public String getProperty(String key);
}
public static interface AttributeHolder {
public void setAttribute(String key, Object o);
}
// debug --------------------
static final int dbg = 0;
static void d(String s) {
if (log.isDebugEnabled())
log.debug("IntrospectionUtils: " + s);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -