Использование 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);
Но есть ли способ сделать это менее уродливым? Спасибо!
Я вижу два решения этой проблемы. (Три, если считать «придерживайтесь 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
, что может быть невозможно.