2014-10-23 2 views
3

В Ruby я могу получить экземпляр переменной Вэл с следующим кодомЧто такое Java функция эквивалентно Рубиновый Object # осматривайте

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"; 
    } 
} 

обновление:

я найти this может решить мой вопрос, но я хочу более простым, как некоторые функции в guava.in рубина, я в первую очередь использовать Object # инспектировать в окне часов инструмента RubyMine, я ожидал я могу использовать его как 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 
    } 
} 
+0

не могли бы вы положить, что (например, код в ссылке) в функцию? –

+0

Близко связанные: http://stackoverflow.com/questions/1350397/java-equivalent-of-python-repr –

ответ

5

Я думаю, что вы хотите ReflectionToStringBuilder в Apache Commons Lang библиотека.

В своем классе, определить свой метод инспектировать() вроде как следует, и вы должны быть в состоянии увидеть ожидаемый результат:

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

Эквивалентный метод: Object#toString(), хотя это дает бесполезный нечитаемый беспорядок, если он не переопределяется.

1

Наиболее распространенный метод - переопределить toString в классе для вывода любого внутреннего состояния класса, а затем использовать его с System.out.println. Если вы хотите сделать что-то более автоматическое, то посмотрите, как отражение или самоанализ могут вам помочь. Попробуйте BeanUtils.

Смежные вопросы