使 toString 我将在下面演示一个实用程序来创建自动化。你可以用它来实现它 toString 自动创建。该工具将自动为指定类生成规则和强大的规则 toString 该方法几乎消除了开发该方法的时间。它还对 toString() 集中管理格式。如果您更改了格式,则必须重生 toString 方法;然而,这仍然比手动将其改为数百个类容易得多。
维护生成的代码也很容易。如果您在类中添加更多属性,您也可能需要 toString 修改方法。因为 toString 该方法是自动生成的,因此您只需再次更改此类操作的实用程序。这比手动方法更简单,也不太可能犯错误。
本文无意解释代码 Reflection API;假设你已经理解了下面的代码 Reflection 基本概念。查看 Reflection API 您可以访问参考资源部分。实用程序的源代码如下:
package fareed.publications.utilities;import java.lang.reflect.*;public class ToStringGenerator{public static void main(String[] args){if (args.length == 0){System.out.println("Provide the class name as the command line argument");System.exit(0);}try {Class targetClass = Class.forName(args[0]);if (!targetClass.isPrimitive() && targetClass != String.class){Field fields[] = targetClass.getDeclaredFields();Class cSuper = targetClass.getSuperclass(); // 检索超类output(”StringBuffer buffer = new StringBuffer(500);"); // 构造缓冲区if (cSuper != null && cSuper != Object.class) {output("buffer.append(super.toString());"); // 超类的 toString()}for (int j = 0; j < fields.length; j++) {output("buffer.append(\"" + fields[j].getName() + " = \");"); // 附加域名if (fields[j].getType().isPrimitive() || fields[j].getType() == String.class) // 检查基本数据类型或字符串类型output(”buffer.append(this." + fields[j].getName() + ");"); // 附加基本数据类型域的值else{/* 它“不”基本数据类型域,因此,有必要检查聚集对象 NULL 值 */output("if ( this." + fields[j].getName() + "!= null )" ); output("buffer.append(this." + fields[j].getName() + ".toString());");output("else buffer.append(\"value is null\"); ");} // else 结束 } // output循环结束(”return buffer.toString();");} } catch (ClassNotFoundException e) {System.out.println("Class not found in the class path");System.exit(0);} }private static void output(String data){System.out.println(data);}}
代码输出通道代码的格式也取决于您的项目工具需求。一些开发人员可能喜欢将这些代码存储在磁盘上的用户定义文件中。其他开发人员 system.out 控制台非常满意。他们可以使用控制台手动复制或嵌入实际文件中的代码。我给你留下这些选择。本文只使用最简单的方法:system.out 语句。
这种方法的局限性这种方法有两个明显的局限性。第一个局限性是它不支持对象的循环包含。假如对象 A 包含对象 B 一个引用,一个对象 B 又包含对象 A 这个工具不能处理一个引用。然而,对于许多项目来说,这种情况很少发生。
第二个限制是在添加或减少成员变量后需要重生 toString 方法。因为无论是否使用这个工具,都需要完成这一步,所以这不是工具的独特问题。
总结在本文中,我解释了一个小型的自动实用程序,它可以真正提高开发人员的效率,在整个项目的工期中起着非常小但非常重要的作用。
