陳鍾誠的程式作品集 -- Java 的反射函式庫

程式作品

C 語言

Java

C#

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);
    }
}

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License