Можно ли получить доступ к частным данным java извне класса?

Возможный дубликат:
Можно ли в Java получить доступ к закрытым полям через отражение

Есть ли способ, чтобы мы могли вызывать частные данные-члены класса в java, чтобы к ним можно было получить доступ за пределами класса. Хочу это банкам из-за каверзного вопроса. Насколько я знаю, я думаю, что это возможно, но я не знаю, как это сделать.


person Aarun    schedule 26.12.2012    source источник


Ответы (7)


1) Вы можете сделать это с отражением, если SecurityManager позволяет

class B {
    private int x = 2;
}

public class A {

    public static void main(String[] args) throws Exception {
        Field f = B.class.getDeclaredField("x");
        f.setAccessible(true);
        f.get(new B());
    }
}

2) в случае внутренних классов

class A {
    private int a = 1;

    class B {
        private int b = 2;

        private void xxx() {
            int i = new A().a;
        };
    }

    private void aaa() {
        int i = new B().b;
    }
person Evgeniy Dorofeev    schedule 26.12.2012
comment
спасибо, дорогой, вот что я ищу ........ - person Aarun; 26.12.2012
comment
Для этого оба класса должны быть в одном пакете? - person Android Killer; 26.12.2012
comment
@Android Killer для размышлений не имеет значения, f.setAccessible (true) нарушает безопасность. - person Evgeniy Dorofeev; 26.12.2012
comment
Спасибо, что поделились своими знаниями. - person Android Killer; 26.12.2012
comment
Что насчет безопасности тогда? Основным мотивом концепции класса является прямое ограничение доступа к полям. Если есть способ получить доступ к частным полям / методам, то как обеспечивается безопасность в Java? - person doga; 17.08.2017

Согласно спецификации языка Java, 3-е издание:

6.6.8 Example: private Fields, Methods, and Constructors

A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor. It is not inherited by subclasses.

Вы можете использовать reflection в java для доступа к закрытым полям. В идеале вы должны использовать общедоступные сеттеры и методы получения для доступа к таким данным извне класса (как опубликовали другие)

person Swapnil    schedule 26.12.2012
comment
Что насчет безопасности тогда? Основным мотивом концепции класса является прямое ограничение доступа к полям. Если есть способ получить доступ к частным полям / методам, то как обеспечивается безопасность в Java? - person doga; 17.08.2017

для получения дополнительной информации о модификаторах доступа проверьте ссылку ниже

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

и это для доступа к частным переменным в Java через отражение

Доступ к частным переменным в Java через отражение

person Ashkan    schedule 26.12.2012

Нет, вы ни в коем случае не можете получить доступ к частным переменным в java.

Вы можете предоставить общедоступные методы получения и установки для доступа или изменения значения частных переменных-членов.

person Yogesh Patil    schedule 26.12.2012
comment
Я знаю это, дорогая, но я не спрашиваю об этом. Пожалуйста, прочтите вопрос как следует - person Aarun; 26.12.2012

  1. Ни один закрытый член не может использоваться вне класса
  2. Для этой цели вы можете использовать методы получения и установки.
person Android Killer    schedule 26.12.2012
comment
Я знаю, дорогой, что private не используется вне класса, но мне нужен код, который делает это возможным. 'class Other {private String str; public void setStr (строковое значение) {str = value; }} class Test {public static void main (String [] args) // Просто для простоты одноразового теста. // Не делайте этого обычно! выдает исключение {Other t = new Other (); t.setStr (привет); Поле field = Other.class.getDeclaredField (str); field.setAccessible (правда); Значение объекта = field.get (t); System.out.println (значение); }} ' - person Aarun; 26.12.2012
comment
Я знаю это, дорогая, но я не спрашиваю об этом. Пожалуйста, прочтите вопрос как следует - person Aarun; 26.12.2012
comment
@ArunKumarThakur, да, дорогой. Вы собираетесь выпустить Java 8? извините за ответ на ваш отличный вопрос, который уже получил -3 голосов. - person Android Killer; 26.12.2012
comment
Извините, дорогой, я снова говорю, что вы не понимаете, о чем я прошу, поэтому, пожалуйста, не комментируйте. И есть способ, который мы обычно не используем, но мы можем получить доступ к частным элементам данных вне класса, то есть путем отражения. - person Aarun; 26.12.2012
comment
Я надеюсь, что вы понимаете, о чем я говорю. - person Aarun; 26.12.2012

Вы можете сделать это с помощью общедоступных методов, которые возвращают / устанавливают значение частного поля.

public Class A{

   private String myData;

   public String getMyData(){
        return myData;
   }

   public void setMyData(String data){
        this.myData=data;
   }
}
person Mawia    schedule 26.12.2012

Определите общедоступный get метод, чтобы получить частное поле вашего класса.

person Nikolay Kuznetsov    schedule 26.12.2012