java - 通过反射获取 Java 字段,而不是通过其 String 名称

标签 java reflection floating-point field primitive

如果我有字段本身,是否可以通过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/

相关文章:

C# 创建类的实例并在字符串中按名称设置属性

c# - 对已加载到应用程序域中的文件使用反射,而不是(再次)加载每个文件

c++ - 如何确定 float 何时通过整数边界

java - itext java开发

java - 在 App Engine 上使用 JDO 持久化 Protocol Buffer 模型

Java 构建已开始失败 - 编译 : java. lang.IllegalAccessError : class lombok. javac.apt.LombokProcessor 时出现 fatal error

java - 从外部类动态加载方法

java - JAXB 文档注释

javascript - 在 Javascript 中使用准确的货币值

java - Java 中使用 double 保持精度