利用Java反射机制反编译一个类的属性方法的小例子

  1. import java.lang.reflect.Constructor;   
  2. import java.lang.reflect.Field;   
  3. import java.lang.reflect.Method;   
  4. import java.lang.reflect.Modifier;   
  5.   
  6. public class CreateClass {   
  7.   
  8.     //依据特定规则截取字符串的函数   
  9.     public static String getLastPartStr(String str){   
  10.         return str.substring(str.lastIndexOf(".") + 1,str.length());   
  11.     }   
  12.   
  13.     public static void main(String[] args) {   
  14.         Load load = new Load();   
  15.         String fileName = "F:\\Boy.class";   
  16.         //通过类加载器获取类对象   
  17.         Class<? extends Object> classObject = load.loadClass("", fileName);   
  18.         //类的访问修饰符   
  19.         String modifier = Modifier.toString(classObject.getModifiers());   
  20.         //类名(完整路径)   
  21.         String className = classObject.getName();   
  22.         //截取类名   
  23.         className = getLastPartStr(className);   
  24.         // 类名   
  25.         System.out.println(modifier + " class " + className + "{");   
  26.   
  27.   
  28.         /*  
  29.          * ==========================================  
  30.          * 获取成员属性  
  31.          * ==========================================  
  32.          */  
  33.         Field[] fields = classObject.getDeclaredFields();   
  34.         System.out.println("\t//成员属性");   
  35.         for (int i = 0; i < fields.length; i++) {   
  36.             Field f = fields[i];   
  37.             // 成员属性的类型   
  38.             String fieldType = f.getType().getName();   
  39.             // 截取   
  40.             fieldType = getLastPartStr(fieldType);   
  41.             // 显示访问修饰符+类型+名称   
  42.             System.out.print("\t" + Modifier.toString(f.getModifiers()) + " "  
  43.                     + fieldType + " " + f.getName() + ";");   
  44.             System.out.println();   
  45.         }   
  46.         System.out.println();   
  47.   
  48.         /*  
  49.          * ==========================================  
  50.          * 获取构造函数  
  51.          * ==========================================  
  52.          */  
  53.         Constructor[] ctr = classObject.getConstructors();   
  54.         // 循环输出构造函数的信息   
  55.         System.out.println("\t//构造函数");   
  56.         for (int i = 0; i < ctr.length; i++) {   
  57.             Constructor con = ctr[i];   
  58.             String conName=con.getName();   
  59.             conName=getLastPartStr(conName);   
  60.             System.out.print("\t" + Modifier.toString(con.getModifiers()) + " "  
  61.                     + conName+"(");   
  62.             // 获取方法的参数列表   
  63.             Class<?>[] fieldCLASS = con.getParameterTypes();   
  64.             con.getParameterAnnotations();   
  65.             // 如果该方法没有参数,就直接输出   
  66.             if (fieldCLASS.length == 0) {   
  67.                 System.out.print("){\n\n\t}");   
  68.             } else {   
  69.                 // 如果该方法有参数,则循环显示参数信息   
  70.                 for (int j = 0; j < fieldCLASS.length; j++) {   
  71.                     // 参数的数据类型   
  72.                     String paraType = fieldCLASS[j].getName();   
  73.                     // 截取参数类型   
  74.                     paraType = getLastPartStr(paraType);   
  75.                     System.out.print(paraType);   
  76.                 }   
  77.                 // 显示方法体部分   
  78.                 System.out.print("){\n\n\t}");   
  79.             }   
  80.             System.out.println();   
  81.   
  82.             /*  
  83.              * ==========================================  
  84.              * 获取类对象的所有方法  
  85.              * ==========================================  
  86.              */  
  87.             System.out.println("\t//方法");   
  88.             Method[] method = classObject.getDeclaredMethods();   
  89.             // 循环列出所有的方法以及方法所具有的参数信息   
  90.             for (int k = 0; k < method.length; k++) {   
  91.                 Method m = method[k];   
  92.                 // 返回值类型   
  93.                 Class<? extends Object> returnTYPE = m.getReturnType();   
  94.                 // 返回值类型的名称   
  95.                 String returnType = returnTYPE.getName();   
  96.                 //方法名称   
  97.                 String methodName=m.getName();   
  98.                 // 截取   
  99.                 returnType = getLastPartStr(returnType);   
  100.                 // 输出方法信息(修饰符 + 返回值类型 + 方法名称)   
  101.                 System.out.print("\t" + Modifier.toString(m.getModifiers())   
  102.                         + " " + returnType + " " +methodName + "(");   
  103.                 // 获取方法的参数列表   
  104.                 Class<?>[] methodCLASS = m.getParameterTypes();   
  105.                 m.getParameterAnnotations();   
  106.                 // 如果该方法没有参数,就直接输出   
  107.                 if (methodCLASS.length == 0) {   
  108.                     System.out.print("){\n\n\t}");   
  109.                 } else {   
  110.                     // 如果该方法有参数,则循环显示参数信息   
  111.                     for (int j = 0; j < methodCLASS.length; j++) {   
  112.                         // 参数的数据类型   
  113.                         String paraType = methodCLASS[j].getName();   
  114.                         // 截取参数类型   
  115.                         paraType = getLastPartStr(paraType);   
  116.                         System.out.print(paraType);   
  117.                         //根据方法的名称设置参数名称   
  118.                         String paraName=methodName.substring(3).toLowerCase();   
  119.                         // 显示方法体部分   
  120.                         System.out.print(" "+paraName);   
  121.                     }   
  122.                     System.out.print("){\n\n\t}");   
  123.                 }   
  124.                 System.out.println();   
  125.             }   
  126.             // 类的结束大括号   
  127.             System.out.println("}");   
  128.         }   
  129.     }   
  130. }   
  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓