当前位置: 首页 > 知识库问答 >
问题:

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

裴俊迈
2023-03-14
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中,我们可以通过使用< code >对象来检查实例的内部。__dict__

我们如何在. java. pde中实现这一点?

共有2个答案

贺桐
2023-03-14

您可以在 Ball 类中重写 toString 并自行打印实例数据。

或者,您可以使用反射获取类实例变量并使用反射打印它们的值,以获取所有字段数据并打印它

西门淮晨
2023-03-14

正如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中,很高兴得到一个<code>dict</code>,您可以进一步使用它。在Java中,理论上可以返回<code>HashMap</code>(或类似的Map结构),但只能关联相同类型的键。在这种情况下,由于所有属性都是可以工作的float,但是您可能会遇到属性为布尔值、浮点值、int值等的情况。解决方法是使用JSONObject:此选项的一个很好的副作用是,您可以通过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数据映射到实例属性。

 类似资料:
  • 我正在使用jdk 11和虚拟主机样式访问(AWS SDK for Java version 2)在AWS s3 bucket中创建/访问对象,如下所示: 虽然我能够在指定的bucket中创建对象,但我无法打印bucket中的内容/对象列表,尽管在我检查权限时,每个人都有权查看bucket中的对象。错误消息为: 这是s3client的创建方式: 这就是我打印列表的方式: BUCKET\u NAME是

  • 我正在尝试将集合的内容打印到Spark控制台。 我有一个类型: 我使用命令: 但这是打印的: res1:组织。阿帕奇。火花rdd。RDD[单位]=MappedRDD[4]位于map at:19 如何将RDD写入控制台或保存到磁盘,以便查看其内容?

  • 问题内容: 我想读取捕获的异常的完整堆栈跟踪。 例如: 我想阅读“ … 23更多”,以了解异常的来源。 问题答案: 答案很简单,这些行已经在stacktrace中了:) 基本上,以下情况正在发生:

  • 我希望在下面的代码中输出一个文本而不是: ie我希望输出为

  • 我应该如何将它打印到我的控制台,并使它显示我在方法中声明的数组? 当我试图打印它时,就像: 不管用,那我该怎么做呢? 我只是想知道如何在我的控制台打印它。