Java中与Ruby Object#inspect等效的函数是什么?

3
在 Ruby 中,我可以使用以下代码获取实例变量 val:
class C
  def initialize(*args, &blk)
    @iv = "iv"
    @iv2 = "iv2"
  end
end

puts "C.new.inspect:#{C.new.inspect} ---- #{::File.basename __FILE__}:#{__LINE__}"
# => C.new.inspect:#<C:0x4bbfb90a @iv="iv", @iv2="iv2"> ---- ex.rb:8

在Java中,我希望能够获得以下结果,应该怎么做?
package ro.ex;

public class Ex {
    String attr;
    String attr2;

    public Ex() {
        this.attr = "attr";
        this.attr2 = "attr2";
    }

    public static void main(String[] args) {
        new Ex().inspect();
        // => Ex attr= "attr", attr2 = "attr2";
    }
}

更新:

我发现这个可以解决我的问题,但我希望更简单,就像guava中的某些函数一样。在Ruby中,我主要使用Rubymine观察工具窗口中的Object#inspect,我希望可以像obj.inspect一样使用它。

更新:

最终,我决定使用Tedy Kanjirathinkal的答案,并通过以下代码自己实现:

package ro.ex;

import com.google.common.base.Functions;
import com.google.common.collect.Iterables;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;

/**
 * Created by roroco on 10/23/14.
 */
public class Ex {
    String attr;
    String attr2;

    public Ex() {
        this.attr = "val";
        this.attr2 = "val2";
    }

    public String inspect() {
        Field[] fs = getClass().getDeclaredFields();
        String r = getClass().getName();
        for (Field f : fs) {
            f.setAccessible(true);
            String val = null;
            try {
                r = r + " " + f.getName() + "=" + f.get(this).toString();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return r;
    }

    public static void main(String[] args) {
        StackTraceElement traces = new Exception().getStackTrace()[0];
        System.out.println(new Ex().inspect());
        // => ro.ex.Ex attr=val attr2=val2
    }
}

你能不能把那个(例如链接中的代码)放到一个函数里? - Dave Newton
紧密相关:https://dev59.com/BnM_5IYBdhLWcg3wgja2 - Ciro Santilli OurBigBook.com
3个回答

6

我猜你想要的是Apache Commons Lang库中的ReflectionToStringBuilder

在你的类中,按照以下方式定义你的inspect()方法,你应该能看到期望的结果:

public void inspect() {
    System.out.println(ReflectionToStringBuilder.toString(this));
}

1
最常见的方法是在类上覆盖toString,以输出类的内部状态,然后与System.out.println一起使用。如果您想要做更自动化的事情,则可以查找如何使用反射或内省来帮助您。尝试使用BeanUtils。

0

等效的方法是Object#toString(),尽管它会返回一个无用的难以阅读的混乱字符串,除非被覆盖掉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接