Java - 反射提取类

时间:2012-02-17 14:44:22

标签: java reflection

这是我的文件(更新):

     import java.lang.reflect.*;

public class ClassExtract {

   public void printClassDefinition (String[] args){
       try {
            Class cls = Class.forName(args[0]);
            Field fieldlist[] 
              = cls.getDeclaredFields();
            for (int i 
              = 0; i < ((fieldlist.length + 1) - (fieldlist.length)); i++) 
            {
                Field fld = fieldlist[i];
                System.out.println("+ " + fld.getDeclaringClass().toString().replaceAll("class", ""));
                System.out.println("------");
            }                              
               for (int j = 0; j < fieldlist.length; j++) {
                   Field fld1 = fieldlist[j];
                   int mod = fld1.getModifiers();
                   System.out.println(Modifier.toString(mod).toString().replaceAll("public", "+") 
                           .replaceAll("private", "-").replaceAll("protected", "#") + " " + 
                           fld1.getType() + " " + fld1.getName());

               }
            }
          catch (Throwable e) {
             System.err.println(e);
          }

   }
  public static void main(String args[])
  {
      new ClassExtract().printClassDefinition(args);

   }
}

我应该读这个文件:

    public class Complex{
    private int re;
    private int im;

    public Complex(int re, int im){
    this.re = re;
    this.im = im;
         }


    public Complex add(Complex h){
            return new Complex(this.re+h.re, this.im+h.im);
        }



    public Complex sub(Complex h){
    return new Complex(this.re-h.re, this.im-h.im);
        }

    public String toString(){
        if (im >= 0){
            return re +" + " +im + "i";
        }
        else return re +"  " +im + "i";
    }

    public static void main(String[] args){

    Complex c1 = new Complex(5,1);
    Complex c2 = new Complex(5,0);

    System.out.printf("c1 = %s, c2 = %s\n", c1, c2);
    System.out.printf("c1 + c2 = %s\n", c1.add(c2) );
     }}

它应该生成类似的东西:

    (+) Complex
     ***
    (-) int re
    (-) int im
     ***
    (+) Complex(re:int, im:int)
    (+) add():Complex
    (+) sub():Complex
    (+) toString():String
    (+) main()

由于我的文件遍历,我在行之后得到“re”和“int”的打印,例如,我的格式一般搞砸了。我可以使用所有可能的帮助。感谢。

1 个答案:

答案 0 :(得分:3)

对不起,我担心你的代码距离解决方案还有几英里远,给你发正确的答案就好像作弊......我会建议你采用以下方法。

  1. 创建一个名为printClassDefinition的函数(类clazz)这将打印otuput的第一行,一旦完成此操作,创建一个只运行代码的这一部分的main方法,运行它几次并确保该函数本身产生正确的输出。
  2. 创建一个名为printFields(Class clazz)的函数。此类循环遍历类的所有字段,并仅打印字段的名称。
  3. 在您在1为主,添加打印语句为您的分隔线,并要求你在步骤2如步骤1中创建的功能,锻炼你的代码,并确保到目前为止,你是幸福的结果。
  4. 创建一个名为printField(Field)的函数在printFields循环中,用println函数替换对printField的调用。
  5. 现在让printField函数为每个字段打印正确的输出。
  6. 再次练习你的主,你的班级和田野输出应该在这个阶段点上。
  7. 与2类似,创建printMethods(Class clazz)。将此电话添加到您的主电话,并练习。
  8. 与4类似,创建printMehod(方法方法)并在printMethods中替换println。就是这样!