为了账号安全,请及时绑定邮箱和手机立即绑定

使用反射输出对象中变量的所有值

使用反射输出对象中变量的所有值

PIPIONE 2021-07-07 18:05:07
我想输出对象中变量的所有值。目前我正在使用,ReflectionToStringBuilder但问题是它[,]在输出集合时包含字符。这是一个例子。import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import org.apache.commons.lang.builder.ReflectionToStringBuilder;import org.apache.commons.lang.builder.ToStringStyle;public class Test {    public int x = 10;    public int y = 20;    public String example = "This is some text, with a comma";    public Collection<Integer> collection = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));    public static void main(String args[])    {        System.out.println(ReflectionToStringBuilder.toString(new Test(),                ToStringStyle.NO_FIELD_NAMES_STYLE));    }}输出Test@efb78af[10,20,This is some text, with a comma,[1, 2, 3, 4, 5]]我试过定义我自己的,ToStringStyle但似乎没有任何选项可以删除方括号和逗号。import org.apache.commons.lang3.builder.ToStringStyle;public class ValueOnlyToStringStyle extends ToStringStyle{    public static final ToStringStyle VALUE_ONLY = new ValueOnlyToStringStyle();    private static final long serialVersionUID = 1L;    private ValueOnlyToStringStyle()     {        super();        this.setContentStart("");        this.setFieldSeparator("  ");        this.setFieldSeparatorAtStart(true);        this.setContentEnd("");        this.setUseClassName(false);        this.setUseFieldNames(false);        this.setArrayContentDetail(true);        this.setArrayStart(" ");        this.setArrayEnd(" ");        this.setArraySeparator(" ");        this.setDefaultFullDetail(true);        this.setNullText("");        this.setSizeStartText("");        this.setSizeStartText("");        this.setFieldNameValueSeparator(" ");        this.setUseShortClassName(false);        this.setUseIdentityHashCode(false);        this.setSummaryObjectStartText(" ");        this.setSummaryObjectEndText(" ");    }}输出10  20  This is some text, with a comma  [1, 2, 3, 4, 5]我需要的是只获取没有添加字符的值。10  20  This is some text, with a comma 1 2 3 4 5这怎么可能实现?
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

我已经在我的机器上尝试过代码,它应该适用于你的例子。


class MyToStringStyle extends ToStringStyle {

    public MyToStringStyle() {

        setFieldSeparator(" ");

        setUseFieldNames(false);

        setUseIdentityHashCode(false);

        setUseClassName(false);

        setContentStart("");

        setContentEnd("");

    }


    @Override

    protected void appendDetail(StringBuffer buffer, String fieldName, Collection<?> coll) {

        if (coll.isEmpty()) return;

        Iterator iter = coll.iterator();

        buffer.append(iter.next());

        while (iter.hasNext()) {

            buffer.append(" ").append(iter.next());

        }

    }

}


查看完整回答
反对 回复 2021-07-23
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我决定编辑代码,因为我已经构建了一个自定义的 ReflectionToStringBuilder 方法。这是方法:


public static String toString(Object object) {

    Class<?> clazz = object.getClass();


    Field[] fields = clazz.getDeclaredFields();


    StringBuilder stringBuilder = new StringBuilder();


    for (Field field : fields) {


        try {

            field.setAccessible(true);

            Object value = field.get(object);


            // check if the value is actually a list

            if (List.class.isAssignableFrom(value.getClass())) {

                // this for some reason gives the unchecked cast warning, but we actually are

                // checking it so don't worry!

                @SuppressWarnings("unchecked")

                List<Object> list = (List<Object>) value;


                for (Object element : list) {

                    stringBuilder.append(element.toString()).append(" ");

                }

            } else if (value.getClass().isArray()) {

                Object[] array = (Object[]) value;


                for (Object element : array) {

                    stringBuilder.append(element.toString()).append(" ");

                }

            } else {

                stringBuilder.append(value.toString()).append(" ");

            }


        } catch (IllegalArgumentException | IllegalAccessException e) {

            e.printStackTrace();

        }

    }

    return stringBuilder.toString();

}

我已经对其进行了测试,并且效果很好。


我的课:


int x = 0;


String string = "string0";


List<String> stringList = Arrays.asList("string1");


String[] stringArray = {"string3", "string4"};


public static void main(String[] args) {

    Test test = new Test();

    System.out.println(toString(test));

}

输出:


0 string0 string1 string3 string4 


查看完整回答
反对 回复 2021-07-23
  • 2 回答
  • 0 关注
  • 221 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信