java - 无法访问Java中相同类型的私有(private)成员

标签 java

我无法访问 Java 中相同类型的私有(private)成员。 我正在分数类型上创建一个方法“add”,但我无法访问其他分数私有(private)变量进行比较。

public Fraction add(Fraction f) {
    int add1 = (this.numerator*f.denominator)+(this.denominator*f.numerator);
    int add2 = this.denominator*f.denominator;
    return createFraction(add1,add2);
}

我应该使用某种反射功能来实现此目的吗?

额外信息:我尚未在接口(interface)上声明私有(private)成员。

额外信息:我不允许在此类上使用 getter 和 setter

额外信息:我无权公开这些字段

最佳答案

您应该在 Fraction 类上创建 getter 和 setter,这样您就可以获取私有(private)变量的值并设置它们。

public class Fraction{
   private int numerator;
   private int denominator;
   public Fraction(final int numerator, final int denominator){
     this.numerator = numerator;
     this.denominator = denominator;
   }
   public int getNumerator(){
     return this.numerator;
   }
   public int getDenominator(){
     return this.denominator;
   }
   public void setNumerator(final int numerator){
    this.numerator = numerator;
   }
   public void setDenominator(final int denominator){
    this.denominator = denominator;
   }
}

然后您可以将代码更改为:

public Fraction add(Fraction f) {
    int add1 = (this.numerator*f.getDenominator())+(this.denominator*f.getNumerator());
    int add2 = this.denominator*f.getDenominator();
    return createFraction(add1,add2); //createFraction can be simply new Fraction(add1, add2);
}

您可以使用Reflection通过使用Field.setAccessible来获取字段的值,但为字段编写getter会更容易、更清晰。

用法示例:

Field field = f.getClass().getDeclaredField("numerator"); 
f.setAccessible(true);
int numerator = (int) field.get(f);

您的代码可以更改为:

public Fraction add(Fraction f) throws NoSuchFieldException, IllegalAccessException{
    Field fieldNumerator = f.getClass().getDeclaredField("numerator");
    fieldNumerator.setAccessible(true);
    Field fieldDenominator = f.getClass().getDeclaredField("denominator");
    fieldDenominator.setAccessible(true);
    final int numerator = (int) fieldNumerator.get(f);
    final int denominator = (int) fieldDenominator.get(f);
    int add1 = (this.numerator*denominator)+(this.denominator*numerator);
    int add2 = this.denominator*denominator;
    return createFraction(add1,add2); 
}

关于java - 无法访问Java中相同类型的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55202983/

相关文章:

java - 意外的 token (END_OBJECT),应为FIELD_NAME : missing property '@type' that is to contain type id

java - 我想在 Java 中使用序列化将 Object 转换为 byte[]

java - 通过添加 '.' 、 ',' 、修剪(不四舍五入)使双倍可读,因此只有最后 2 位数字可能?

java - 将此功能添加到 Java 中是否有意义 : default member collections?

Java 扫描器 Csv useDelimiter

java - Java 中 JSONArray 中的搜索元素

java - LinkedList.contains 执行速度

Java 网络应用程序 : strange memory statistics

java - 如何在使用运行配置正确配置的 Eclipse 中创建 Spring Boot Starter 项目?

java - 执行搜索的最佳方式