Доступ к свойству объекта

Как получить доступ к свойству объекта или связанного объекта, используя метаданные или отражение класса?

Предположим, у нас есть эти классы

class Person {    
    public String name;

    public void Person( name ) {
       this.name = name;
    }

}

class A {
    public String name;
    public void A(name) {
        this.name = name
    }
}

class B {
    public Person person;
    public void A(name) {
        this.person = new Person(name)
    }
}

Как мы видим, есть разные способы доступа к имени свойства

Для первого класса:

A p = new A("Tom")
// Access to the name
p.name

Для второго класса

B p = new B("Tom")
// Access to the name
p.person.name

Теперь предположим, что нам нужен универсальный класс для доступа к имени свойства из 2 классов, но универсальный класс не знает об этой структуре. Этот класс так или иначе должен был бы получить доступ к информации о том, какова структура. Слушайте что-то вроде метаданных или рефлексии.

Как правильно получить и использовать эту информацию?

-1
задан 17.01.2017, 10:35
0 ответов

Я рекомендую тебе использовать Отражение, так как он кроме того позволил бы тебе получать стоимость частных переменных. Я оставляю тебе соединение для того, чтобы ты бросил vistado. Соединение Java Reflection

public class PrivateObject {

  private String privateString = null;

  public PrivateObject(String privateString) {
     this.privateString = privateString;
  }

}

И это часть Отражения:

PrivateObject privateObject = new PrivateObject("The Private Value");
Field privateStringField = PrivateObject.class.getDeclaredField("privateString");

privateStringField.setAccessible(true); // Ponemos la variable publica

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
0
ответ дан 03.12.2019, 17:39

Я рекомендую тебе не использовать приближение, которое ты показываешь. Лучшее состоит в том, что ты веришь себе в интерфейс, чтобы получать эту информацию, и осуществи ее с классами, которые ты хочешь, чтобы они ответили на этот характерный класс:

public interface Nombrable {
    public String getNombre();
}

И ты осуществляешь ее в твоих классах:

public class A implements Nombrable {
    String name;
    @Override
    public String getNombre() {
        return name;
    }
}

public class B implements Nombrable {
    @Override
    public String getNombre() {
        return person.name;
    }
}

Так ты сможешь соглашаться на имя с методом getNombre() так как ты определил, что осуществляют этот интерфейс.

String nombreA = a.getNombre();
String nombreB = b.getNombre();

И кроме того ты можешь определять в тебе характерно, что были этого типа, если ты делаешь заявление как <T extends Nombrable>

0
ответ дан 03.12.2019, 17:39