2

如何在 Java 中打印任何类实例?类似于 Javascript 中的 JSON.stringify()。不需要 JSON,任何格式的输出都可以。

public class User {
    public String name, password;
    public int age;
    public ArrayList<String> phones;
    public static void login() {
        //do something
    }
}

User X = new User;
X.name = "john connor";
X.password = "skynet";
X.age = "33";
X.phones.add("1234567");
X.phones.add("7654321");

System.out.println(printClass(X))

应该输出如下内容:

{ name:"john connor", password: "skynet", age: "33", phones: 
     ["1234567", "7654321"], login: void function() }
4

4 回答 4

3

您可以使用 Apache 的 commons-langToStringBuilder.reflectionToString

当然,反射很慢,所以只对您的测试代码执行此操作。对于正常使用,请使用 eclipse 的“Source”菜单 -> generate toString()(或 intellij 的 generate toString()),它会为您提供一个不错的字符串。

于 2013-10-05T05:50:07.730 回答
2

可能有很多方法可以实现您所需要的。虽然我会对你为什么需要感兴趣。

  1. 覆盖toString()方法。

    见:http ://www.javapractices.com/topic/TopicAction.do?Id=55

  2. 如果生成算法变得太长,那么考虑一个单独的类 say UserPrettyPrinter

    public interface UserPrettyPrinter {
      string print(User);
    }
    
    public class PrintUserInJSON implements UserPrettyPrinter {
      string print(User user) {
        //implement the algo here
      }
    }
    

    您还可以实现:

    public class PrintUserInXML implements UserPrettyPrinter {
      string print(User user) {
        //implement the algo here
      }
    }
    
  3. 无论是与number-2共轭还是作为一个独立的类,您都可以编写

    public class PrintObjectBasicAlgo {
      String print(Object obj) {
        /* i write pseudo code here. just ask if you cannot implement this
        this would help: http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html
    
        Class class = Obj.getClass();
    
        Filed[] allVariables = class.getAllFieldsByReflection();
    
        ArrayList<String> keys = new ArrayList<String>;
        ArrayList<String> values = new ArrayList<String>;
    
        for(Field field : allVariables) {
            Object value = reflectionGetValueOfField( field, obj );
            keys.add( field.getName());
            values.add(value.toString());
        }
    
        now that you have the keys and values, you can generate a string in anyway you like
    
        */
      }
    }
    
  4. 您可能会看到访客模式。这可能会有所帮助。

于 2013-10-05T06:10:59.783 回答
1

您在这里有两个选择。最简单的就是toString为你的类重写函数。我不明白你为什么不这样做。在这种情况下,它很简单

String toString(){
    return "{ name:\""+name+", password: \""+passowrd....
}

第二种选择是使用反射。如果您有一些用于“打印类”的外部类,这会稍微(尽管不是真的)更好。的伪代码将是

StringBuilder s = new StringBuidler();
for(Field f : fields){
    s.append(f.getName() + "\" :\"" + f.get()+ "\"");
}
return s.toString();

然而,这将是昂贵的,因为反射总是如此。此外,如果您首先正确地覆盖toString函数,那么您的printClass函数实际上可能只是

String printClass(Object o){ return o.toString();}

当然,这又引出了为什么需要一个printClass函数的问题?

于 2013-10-05T05:45:19.077 回答
0

一种选择是使用 Google Gson。

导入 java.util.ArrayList;导入 java.util.List;导入 com.google.gson.Gson;

class Project {
private int year = 1987;
private String name = "ROBOCOP-1";
private boolean active = false;
private List<String> list = new ArrayList<String>() {
  {
    add("PROTECT THE INNOCENT");
    add("UPHOLD THE LAW");
    add("SERVE THE PUBLIC TRUST");
    add("CLASSIFIED");
  }
};
}

public class GsonExample {
public static void main(String[] args) {
    Project obj = new Project();
    Gson gson = new Gson();
    String json = gson.toJson(obj);
    System.out.println(gson.toJson(obj));
}
}
于 2013-10-06T03:16:22.100 回答