陳鍾誠的程式作品集 -- Java 的反射函式庫
程式作品C 語言JavaC#JavaScript常用函數文字處理遊戲程式衛星定位系統程式資料結構網路程式自然語言人工智慧機率統計資訊安全等待完成訊息相關網站參考文獻最新修改簡體版English |
package ccc; import java.util.*; import java.lang.reflect.*; public class REFLECT { public static void main(String[] args) throws Exception { StringBuffer buffer = new StringBuffer("hello!"); System.out.println(class2xml(buffer.getClass())); System.out.println(object2xml("buffer", buffer)); Vector vector = new Vector(); Object[] array = { "a", "b", "c" }; vector.addAll(Arrays.asList(array)); System.out.println(class2xml(vector.getClass())); System.out.println(object2xml("vector", vector)); Object[] params = { new Integer(1), "d"}; System.out.println("getMethod : "+getMethod(vector.getClass(), "set")); callMethod(vector, "set", params); System.out.println(object2xml("vector", vector)); // System.out.println(buffer.getClass().toString()); } public static String field2str(Field pField) { String fieldType = pField.getType().getName(); String modifier = Modifier.toString(pField.getModifiers());; return modifier+" "+fieldType+" "+pField.getName(); } public static String types2str(Class[] pClasses) { StringBuffer rzXml = new StringBuffer(); for (int i = 0; i < pClasses.length; i ++) { rzXml.append(pClasses[i].getName()); if (i < pClasses.length-1) rzXml.append(","); } return rzXml.toString(); } public static String class2xml(Class pClass) throws Exception { StringBuffer rzXml = new StringBuffer(); Class superClass = pClass.getSuperclass(); String classPath = pClass.getName(); rzXml.append("<class name=\""+classPath+"\" "); if (superClass != null) rzXml.append("super=\""+superClass.getName()+"\" "); rzXml.append(">\n"); rzXml.append(" <interfaces>"+types2str(pClass.getInterfaces())+"</interfaces>\n"); Field[] fields = pClass.getFields(); for (int i = 0; i < fields.length; i++) rzXml.append(field2str(fields[i])); Constructor[] constructors = pClass.getConstructors(); for (int i = 0; i < constructors.length; i++) { String modifier = Modifier.toString(constructors[i].getModifiers()); rzXml.append(" <constructor>"+modifier+" "+pClass.getName()+"("); rzXml.append(types2str(constructors[i].getParameterTypes())); rzXml.append(")</constructor>\n"); } Method[] methods = pClass.getMethods(); for (int i = 0; i < methods.length; i++) { String returnType = methods[i].getReturnType().getName(); String modifier = Modifier.toString(methods[i].getModifiers()); rzXml.append(" <method>"+modifier+" "+returnType+" "+methods[i].getName()+"("); rzXml.append(types2str(methods[i].getParameterTypes())); rzXml.append(")</method>\n"); } rzXml.append("</class>\n"); return rzXml.toString(); } public static String object2xml(String pName, Object pObj) throws Exception { StringBuffer rzXml = new StringBuffer(); Class pClass = pObj.getClass(); String classPath = pClass.getName(); rzXml.append("<object name=\""+pName+"\" class=\""+classPath+"\">\n"); rzXml.append(" <value>"+pObj.toString()+"</value>\n"); rzXml.append("</object>\n"); return rzXml.toString(); } public static Field getField(Class pClass, String pFieldName) throws Exception { Field[] fields = pClass.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { String fieldName = fields[i].getName(); if (pFieldName.equals(fieldName)) return fields[i]; } return null; } public static Method getMethod(Class pClass, String pMethod) { String name = STR.head(pMethod, "("); String paramStr = STR.innerText(pMethod, "(", ")"); if (paramStr == null) paramStr = ""; String[] params = paramStr.split(","); Method[] methods = pClass.getDeclaredMethods(); for (int mi=0; mi<methods.length; mi++) { if (!name.equals(methods[mi].getName())) continue; if (pMethod.indexOf("(")<0) return methods[mi]; Class[] paramTypes = methods[mi].getParameterTypes(); if (params.length!=paramTypes.length) continue; boolean isParamEqual = true; for (int pi = 0; pi < paramTypes.length; pi ++) { String callParam = params[pi].toLowerCase(); String paramType = paramTypes[pi].getName().toLowerCase(); String className = STR.last(paramType, "."); if (callParam.equals("")) continue; if (callParam.equals("int") && paramType.equals("integer")) continue; if (callParam.equals("integer") && paramType.equals("int")) continue; if (!callParam.equals(className)) { isParamEqual = false; break; } } if (isParamEqual) return methods[mi]; } return null; } public static Object getMember(Object pObj, String pField) throws Exception { Field field = getField(pObj.getClass(), pField); return field.get(pObj); } public static void setMember(Object pObj, String pField, Object pValue) throws Exception { Field field = getField(pObj.getClass(), pField); field.set(pObj, pValue); } public static Object callMethod(Object pObj, String pMethod, Object[] pParams) throws Exception { Method method = getMethod(pObj.getClass(), pMethod); return method.invoke(pObj, pParams); } } |
page revision: 0, last edited: 04 Nov 2010 03:49
Post preview:
Close preview