У меня есть несколько фасолей java (которые имеют атрибуты private
и методы getter/setter
). И мог бы построить экземпляры с Map<String, Object>
, как это в конструкторе:java статический завод в суперклассе
public class A {
private String name;
private String gender;
...
public A(Map<String, Object> m){
BeanInfo beanInfo = Introspector.getBeanInfo(this.getClass());
for(PropertyDescriptor pd: beanInfo.getPropertyDescriptors()){
if(pd.getName().equals("class")){
continue;
}
Method setter = pd.getWriteMethod();
if(setter != null && m.get(pd.getName())!=null){
setter.invoke(this,m.get(pd.getName()));
}
}
}
getter()/setter()
...
}
Но когда есть некоторые дети классов, которые расширяют класс A
, должна быть соответствующим конструктором каждый раз, когда я пишу новый подкласс:
public class B extends A {
public B(Map<String, Object> m){
super(m);
}
}
Я нахожу это раздражает, и я хочу, чтобы построить статический фабричный метод родительского класса A
сделать это один раз для всех (Может быть, какой-то код, как это в классе A
?):
public static fromMap(Map<String, Object>){
return new // I really don't have a clue how to write this.
}
И мог ли кто-нибудь дать мне подсказку о том, как написать этот заводский метод? Или это возможно? Может быть, какой-то общий трюк?
как вы предполагаете знать, какие подклассы будут или какие дополнительные функции у них будут? – Stultuske
Является ли полное имя класса в «классе» на карте? – Bohemian
@Stultuske Так как я использую рефлекс для инициализации класса, без какого-либо определенного метода, определенного подклассом, я думаю * возможно * информация о классе может откладываться на время выполнения, чтобы получить? – armnotstrong