2013-09-08 5 views
0

У меня есть класс A с частным членом int myMember. И класс B с частным членом класса A, называемый myA;Доступ к частному члену класса-члена

То есть:

public class A{ 
    private int myMember; 
    ... 
} 

public class B{ 
    private A myA; 

} 

Я хотел бы иметь возможность доступа:

B.myA.myMember; 

но мне кажется, я не могу, потому что myMember является частным в А. Дело в том, мне нужно A, который будет определен как частный для целей упражнения (который также включает в себя его нельзя защитить). Есть ли способ обойти это?

Спасибо.

+0

(1) Почему вы хотите прямой доступ к полю? (2) Не имеет значения, является ли «А» приватным; важно то, что 'myMember' является закрытым. Можете ли вы это изменить? – chrylis

+4

Используйте геттер. Используйте отражение. –

+1

Если ваш учитель дал это упражнение, возможно, он хочет, чтобы вы использовали отражение. Иначе это просто, Частный частный, вы не можете получить к нему доступ извне. – mawia

ответ

2

Поскольку вы заявили, вы не можете создать более открытые методы, иначе добытчиков, вы можете использовать отражение ...

public class A{ 
    private int myMember; 
    ... 
} 

public class B{ 
    private A myA; 

    private int get(){ 
     try { 
      Field field = myA.getClass().getDeclaredField("myMember"); 
      field.setAccessible(true); 
      return (int) field.get(myA); 
     catch (Exception e){ 
      //Something went wrong, the field doesn't exist or a security exception 
      return null; //or return some "error number" like -10 
     } 
    } 



} 
+1

RIP privacy, но я woudnt использую отражение, если это не будет полностью неудобно, это можно решить с помощью простого getter. – kajacx

+1

Правда, однако он заявил, что не может создавать новые общественные методы – DeadChex

6
public class A { 

private int myMember; 

public int getMyMember() { 
    return myMember; 
} 

public void setMyMember(int myMember) { 
    this.myMember = myMember; 
} 

} 


public class B{ 

private A myA; 

public B() { 
    myA = new A(); 
    myA.setMyMember(0); 
    int a = myA.getMyMember(); 
} 
} 
3

Использование добытчики:

public class A { 
    private int myMember; 
    public getMyNumber() { 
     return myNumber; 
    } 
} 

public class B { 
    private A myA; 
    public A getA() { 
     return myA; 
    } 
} 

Итак, теперь вы можете закодировать:

B b = new B(); 
b.getA().getMyMember(); 
+0

да, я тоже об этом подумал. Но число общественных функций не должно увеличиваться. Я не знаю, что-то не так. Спасибо за Ваш ответ. – elelias

+0

возможно размер по умолчанию? чем он может использоваться в пакете, у вас все еще есть геттер. – extraneon

1

Если вы можете объявить t он частное поле, как статического то что-то, как это возможно:

public class A { 
    private int myMember; 
} 

public class B { 
    public static void main (String[] args) { 
     int myMember = new A() { 
      public int getPrivate() { 
       return myMember; 
      } 
     }.getPrivate(); 
     System.out.print("\n\t Id : " + myMember); 
    } 
}