如何打印 java 或 pde 中实例的内容?

How to print the contents of an instance in java or pde?

class bouncingBall():
    def __init__(self, bounce, window, position):
        self.bounce = bounce
        self.window = window
        self.position = position

ball = bouncingBall(0.35, 1.5, 0.75)
print(ball) # <__main__.bouncingBall object at 0x0000025980427D60>
print(ball.__dict__) # {'bounce': 0.35, 'window': 1.5, 'position': 0.75}

在python中我们可以使用object.__dict__

检查一个实例的内部

我们如何在 .java.pde 中完成此操作?

您可以在 Ball class 中覆盖 toString 并打印实例数据 你自己。

或者你可以使用反射Get the class instance variables and print their values using reflection得到 所有字段数据并打印出来

正如 Saksham(+1) 指出的那样,一种选择是覆盖 toString():这是手动的,但没有反射开销。

您还可以使用 java.lang.reflect.*; ,您可以将其用于超类中的实用函数,然后您的所有子类都将继承此特征(无需为每个子类手动覆盖 toString() ),但是,您会花费一些 CPU 时间来反思。

这是一个非常粗略的例子来展示这两者:

// option 2: reflect
import java.lang.reflect.*;

class BouncingBall{

  float bounce;
  float window;
  float position;
    
  BouncingBall(float bounce, float window, float position){
    this.bounce = bounce;
    this.window = window;
    this.position = position;
  }
  // option 1: override toString() (manual)
  String toString(){
    return String.format("[BouncingBall bounce=%.2f window=%.2f position=%.2f]", 
                                        bounce, window, position);
  }
}

void setup(){
  BouncingBall ball = new BouncingBall(0.35, 1.5, 0.75);
  println("ball properties and values via toString()");
  println(ball);
  println();
  
  println("ball properties and values via reflection");
  // reflect instance fields
  try{
    for(Field field : BouncingBall.class.getDeclaredFields()){
      println(field.getName(), field.get(ball));
    } 
  }catch(IllegalAccessException e){
    e.printStackTrace();
  }
}

更新 在 Python 中,很高兴你得到一个 dict 回来,你可以进一步使用它。 在Java中,理论上你可以return一个HashMap(或类似的Map结构),但是你只能关联相同类型的键。 在这种情况下,由于所有属性都是可以工作的浮点数,但是您可能会遇到属性是布尔值、浮点数、整数等的情况。 解决方法是使用 JSONObject: a nice side effect of this option is you could easily serialize/save the data to disk via saveJSONObject():

import java.lang.reflect.Field;

class BouncingBall{

  float bounce;
  float window;
  float position;
    
  BouncingBall(float bounce, float window, float position){
    this.bounce = bounce;
    this.window = window;
    this.position = position;
  }
  
  // option 1: override toString() (manual)
  String toString(){
    return String.format("{\"bounce\":%.2f, \"window\":%.2f, \"position\":%.2f}", 
                             bounce, window, position);
  }
  // option 2: reflect
  JSONObject toJSON(){
    JSONObject result = new JSONObject();
    try{
      for(Field field : BouncingBall.class.getDeclaredFields()){
        // handle floats for demo purposes
        if(field.getType() == float.class){
          result.setFloat(field.getName(), (float)field.get(this));
        }
      } 
    }catch(IllegalAccessException e){
      e.printStackTrace();
    }
    return result;
  }
}

void setup(){
  BouncingBall ball = new BouncingBall(0.35, 1.5, 0.75);
  println("ball properties and values via toString()");
  println(ball);
  println();
  
  println("ball properties and values via reflection");
  println(ball.toJSON());
  
  // save JSON data
  saveJSONObject(ball.toJSON(), "ball.json");
}

(请注意格式化 toString() 的手动选项,以便数据有效 JSON 也有效(可以通过 saveStrings() 保存到磁盘)

同样,如果需要,您可以使用反射将加载的 JSON 数据映射到实例属性。