代码之家  ›  专栏  ›  技术社区  ›  user1688726

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

  •  1
  • user1688726  · 技术社区  · 7 年前

    我无法访问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);
    }
    

    附加信息:我还没有声明接口上的私有成员。

    附加信息:我不允许在这个类上使用getter和setter

    1 回复  |  直到 7 年前
        1
  •  3
  •   Unmitigated    7 年前

    你应该在你的 Fraction

    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

    用法示例:

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