如何打印 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 数据映射到实例属性。
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 数据映射到实例属性。