无法访问Java中相同类型的私有成员

时间:2019-03-17 01:04:51

标签: java

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

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);
}

我是否应该使用某种反射功能来实现这一目标?

其他信息:我尚未在界面上声明私有成员。

其他信息:我不允许在此类上使用吸气剂和吸气剂

其他信息:我不允许公开这些字段

1 个答案:

答案 0 :(得分:2)

您应该在Fraction类上创建getter和setter,以便可以获取和设置私有变量的值。

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);
}

您可以通过使用Field.setAccessible来使用Reflection来获取字段的值,但是为该字段编写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); 
}