Возможно ли в Java получить имя поля в строке из фактического поля? как:
public class mod {
@ItemID
public static ItemLinkTool linkTool;
public void xxx{
String fieldsName = *getFieldsName(linkTool)*;
}
}
PS: я не ищу имя класса/класса поля или получаю поле из имени в строке.
РЕДАКТИРОВАТЬ: Когда я смотрю на это, мне, вероятно, не понадобится метод для получения имени поля, экземпляра поля (из «кодового имени» поля) будет достаточно. [например. Field myField = getField(linkTool)
]
Вероятно, в самой Java нет ничего похожего на то, что я хочу. Я взгляну на библиотеку ASM, но в конце концов я могу использовать строку в качестве идентификатора для полей:/
EDIT2: Мой английский не очень хорош (но даже на моем родном языке у меня были бы проблемы с объяснением этого), поэтому я добавляю еще один пример. Надеюсь теперь будет понятнее:
public class mod2 {
@ItemID
public static ItemLinkTool linkTool;
@ItemID
public static ItemLinkTool linkTool2;
@ItemID
public static ItemPipeWrench pipeWrench;
public void constructItems() {
// most trivial way
linkTool = new ItemLinkTool(getId("linkTool"));
linkTool2 = new ItemLinkTool(getId("linkTool2"));
pipeWrench = new ItemPipeWrench(getId("pipeWrench"));
// or when constructItem would directly write into field just
constructItem("linkTool");
constructItem("linkTool2");
constructItem("pipeWrench");
// but I'd like to be able to have it like this
constructItemIdeal(linkTool);
constructItemIdeal(linkTool2);
constructItemIdeal(pipeWrench);
}
// not tested, just example of how I see it
private void constructItem(String name){
Field f = getClass().getField(name);
int id = getId(name);
// this could be rewritten if constructors take same parameters
// to create a new instance using reflection
if (f.getDeclaringClass() == ItemLinkTool){
f.set(null, new ItemLinkTool(id));
}else{
f.set(null, new ItemPipeWrench(id));
}
}
}
Возникает вопрос: как мог бы выглядеть метод buildItemIdeal? (Из ответов и гугления я думаю, что это невозможно на Java, но кто знает..)
ItemLinkTool
, вероятно, имеет более одного метода. Что должен вернуть ваш методgetFieldsName
в таком случае? - person maksimov   schedule 19.02.2013@ItemID
(поля пусты, и другие поля будут одного типа), на следующем этапе я хотел бы обращаться к полям по их именам, а не по строкам (я написал причины ниже) . Из имени строки я мог бы получить экземпляр поля, а затем использовать его в качестве индекса на карте, чтобы получить его идентификатор (необходимый в конструкторе класса поля). Основываясь на классе поля (и, возможно, аннотации), я мог бы создать экземпляр и присвоить его значению поля. PS: под Полем я подразумеваю java.lang.reflect.Field, а не любое поле. - person monnef   schedule 19.02.2013