Как я могу получить динамический доступ к свойству объекта Java в GWT?

Использование GWT У меня есть класс Java:

public class Pojo {
  private String name;
  public String getName() { return name; }
  public void setName(String name) { this.name = name; }
}

Вышеупомянутый класс используется совместно клиентским и серверным кодом.

Из клиентского кода я хотел бы получить динамический доступ к свойству . То есть я хотел бы написать метод со следующей сигнатурой:

public String getProperty(Object o, String propertyName)

Чтобы следующий код работал:

Pojo pojo = new Pojo();
pojo.setName("Joe");
getProperty(pojo, "name");    // this should return "Joe"

Очевидно, что отражение Java отсутствует. И я попробовал следующий метод JSNI:

public static native String getProperty(Object o, String name) /*-{
  return o[name];
}-*/;

Но он не работает.

Специальный синтаксис для доступа к объектам Java из JavaScript также не может использоваться, поскольку я хочу, чтобы он был динамическим.

Есть идеи, как я могу это сделать?

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

РЕДАКТИРОВАТЬ: ответ blwy10 был отличным советом, который помог мне выполнить поиск с помощью " gwt reflection "вместо таких терминов, как" #define TOSTRING (x) STRINGIFY (x) #define AT __FILE__ ":" TOSTRING (__ LINE__) void __my_error (const char * loc, const ...

У меня есть отладочный код, который выглядит следующим образом:

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void __my_error(const char*loc, const char *fmt, ...);
#define my_error(fmt, ...) __my_error(AT, fmt, ##__VA_ARGS__)

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

my_error("Uh oh!");

Я бы хотел, чтобы мой код был C99, поэтому я обнаружил, что при компиляции я получаю следующую ошибку:

error: ISO C99 requires rest arguments to be used

Я знаю, что могу решить это, изменив вызов на

my_error("Uh oh!", NULL);

Но есть ли способ сделать это менее уродливым? Спасибо!

10
задан Michael Mior 31 August 2010 в 11:56
поделиться

1 ответ

Я вижу два решения этой проблемы. (Три, если считать «придерживайтесь gcc»).

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

Добавьте новый макрос, когда вы хотите напечатать фиксированную строку.

#define my_errorf(str) my_error(str, NULL)

Pro: минимальное количество дополнительного кода.
Против: Легко использовать неправильный макрос (но, по крайней мере, вы заметите это во время компиляции).

Поместите fmt внутри '...'

Макрос vararg может иметь только __VA_ARGS__ в качестве параметра (в отличие от функций vararg). Таким образом, вы можете поместить аргумент fmt внутри __VA_ARGS__ и изменить свою функцию.

void __my_error(const char *loc, ...);
#define my_error(...) __my_error(AT, __VA_ARGS__)

Pro: один синтаксис/макрос для всех сообщений об ошибках.
Против: требуется переписать вашу функцию __my_error, что может быть невозможно.

14
ответ дан 3 December 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: