a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 105|回复: 0

[其他] JAVA技巧:怎样使toString()的创建自动化

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
有经验的 Java 开发人员都知道写好 toString 体例很主要。对可用人类理解的形式查看的对象进行记实和调试都相当轻易;当措置分布式应用轨范时尤其是这样。不幸的是,为良多类实现 toString 体例可能相当耗时 -- 尤其是对于那些具有良多属性的类。因为 toString 的行为相当轨则,所以最好使建树该体例的使命能够自动完成。本文供给的这个适用轨范可以辅佐您实现这一点,同时也减轻了内在开发时的承担。介入年夜项目的开发人员凡是要花数个小时编心暌剐用的 toString 体例。即便不为每个类都供给属于它们自己的 toString 体例,但每个数据容器都必需有自己的 toString 体例。让每个开发人员按他们自己的体例编写 toString 体例可能会造成杂乱;每个开发人员无疑城市提出一种独一的名目。结不美观,在调试过程中使用这样的输出将增添不需要的麻烦,而且也没有什么益处。是以,每个项目都应该为 toString 体例划定一种单一的名目,并使它们的建树自动化。 使 toString 的建树自动化+ \9 H8 A- d( V
  我下面将演示一个适用轨范,您可用它来实现 toString 的自动建树。这个工具会自动为指定的类生成一个轨则的、健旺的 toString 体例,几乎消弭了用于开发该体例的时刻。它还对 toString() 的名目进行集中打点。如不美观您更改了名目,则必需年夜头生成 toString 体例;可是,这仍然比手动更改成百上千个类要轻易得多。 对生成的代码进行维护也很轻易。如不美观内在类中添加了更多的属性,则您也可能需要对 toString 体例作一些改削。因为 toString 体例是自动生成的,所以您只须再次对该类运行这个适用轨范来完成更改。这比手动体例更简单,而且犯错误的可能性也较小。 代码  S+ S$ f( V( ]4 y6 Z
  本文无意诠释 Reflection API;下面的代码假定您已理解 Reflection 的根基概念。要查看 Reflection API 的文档,您可以访谒参考资本部门。适用轨范的源代码如下所示: package fareed.publications.utilities;
; F2 |) d  i% P! p: l: Z7 B  import java.lang.reflect.*;public class ToStringGenerator  b' t4 C. r" `
  {
; Z+ P# L7 R2 D' e% f, K7 ?  public static void main(String[] args)" x% s& C) m  @' i8 t
  {/ L* ?0 y+ `, p% ?; K# Z; V1 [
  if (args.length == 0)
( W# n. n$ R' n3 |8 G  {
# E6 N' @: Q3 l) Y; X1 l7 I  System.out.println("Provide the class name as the command line argument");
4 s' f" D; m) s1 l3 j  System.exit(0);
/ ]6 k4 I/ v- f  }try {Class targetClass = Class.forName(args[0]);if (!targetClass.isPrimitive() && targetClass != String.class)# H/ C6 R4 ?1 P4 t0 k! W& S! w
  {
, ]/ h$ e+ l/ |6 V& J/ ]  Field fields[] = targetClass.getDeclaredFields();Class cSuper = targetClass.getSuperclass(); // 检索超类output("StringBuffer buffer = new StringBuffer(500);"); // 机关缓冲区if (cSuper != null && cSuper != Objectfor (int j = 0; j < fields.length; j++) {0 z) o  i' I3 J- ^! Y  g0 X4 c6 J
  output("buffer.append("" + fields[j].getName() + " = ");"); // 附加域名称if (fields[j].getType().isPrimitive()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-9 01:02 , Processed in 0.289663 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表