如果我有字段本身,是否可以通过Java反射获取字段?这是一个原始的 float (公共(public),没问题)。我不想将其名称用作字符串。
示例:
public class TVset {
public float voltageA;
public float voltageB;
public float voltageC;
public TVset(...) {...} // constructor
public void function() {...} // it changes voltages
}
class Voltmeter{
Object theObject;
Field theField;
Voltmeter(Object obj) {
theObject = obj;
Class theFieldClass = obj.getClass();
Class theContainerClass = theFieldClass.getDeclaringClass();
Field theField = ??? // <-- here I don't want to use a String
}
float getVoltage() {
return theField.getFloat(theObject);
}
}
TVset tv1 = new TVset(...);
TVset tv2 = new TVset(...);
Voltmeter meter = new Voltmeter(tv1.voltageB);
meter.getVoltage();
tv1.function();
meter.getVoltage(); <- should reflect the changed voltage
tv1.function();
meter.getVoltage(); <- should reflect the changed voltage
...
效果类似于通过引用传递 float ,但不将其包装到包装类中。
我需要测量不同电视机上的不同电压,只需更改线路即可:
Voltmeter meter = new Voltmeter(tv1.voltageB);
其他内容,例如:
Voltmeter meter = new Voltmeter(tv2.voltageA);
是否可以通过反射来做到这一点?
谢谢
最佳答案
要使用反射,您必须使用字符串。您可以使用对象来包装可变浮点或简单的浮点[1],而不是使用浮点;
顺便说一句,除非你有充分的理由,否则我不会使用 float,double 的舍入误差要小得多。
public class TVset {
public double[] voltageA = { 0.0 };
public double[] voltageB = { 0.0 };
public double[] voltageC = { 0.0 };
}
class Voltmeter{
final double[] theField;
Voltmeter(double[] theField) {
this.theField = theField;
}
double getVoltage() {
return theField[0];
}
}
// works just fine.
Voltmeter meter = new Voltmeter(tv1.voltageB);
编辑:使用抽象访问器。这是最快的方法。 AFAIK,差异小于 10 纳秒。
public abstract class Voltmeter{ // or use an interface
public abstract double get();
public abstract void set(double voltage);
}
public class TVset {
private double _voltageA = 0.0;
private double _voltageB = 0.0;
private double _voltageC = 0.0;
public final Voltmeter voltageA = new Voltmeter() {
public double get() { return _voltageA; }
public void set(double voltage) { _voltageA = voltage; }
}
public final Voltmeter voltageB = new Voltmeter() {
public double get() { return _voltageB; }
public void set(double voltage) { _voltageB = voltage; }
}
public final Voltmeter voltageC = new Voltmeter() {
public double get() { return _voltageC; }
public void set(double voltage) { _voltageC = voltage; }
}
}
就我个人而言,如果速度至关重要,我会直接按名称使用字段。没有比这更简单或更快的了。
关于java - 通过反射获取 Java 字段,而不是通过其 String 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5383947/