反射:创建一个实例-java



我正在尝试构建一个动态gui。

我有以下类:

Public abstract  class Property
String ip1;
int port;
还有很多子类是从这个类创建的,比如下面两个:
public   class PropertyDns extends Property
 string ip2;
 int port2;
Public class PropretyNetBios extends Property
long time;

目标:用户选择子属性之一,然后我想要呈现他需要填写的字段,以便创建实例。例如:如果他被选为PropertyDns,我将呈现:"ip1:____ port1:______ ip2:_______ port2:______"当他完成后,他将按"ok",然后我想用他选择的值创建这个类的实例。

有什么办法可以做到吗?

i使用反射显示字段:

    Field[] s1=p.getClass().getSuperclass().getDeclaredFields();  
            Field[] s=p.getClass().getDeclaredFields();
for (int i = 0; i < s.length; i++) {
    ans[i]=s[i].getName();
}

但是我认为做得很差

不使用反射并且通过在您的Property类中定义基本行为,您可以从一组已知变量中枚举表单元素。

如果你特别想使用反射,我建议你先创建一个基本的工作示例,如果你有困难,然后寻求帮助。

abstract class Property {
    abstract Map<String, String> getPropertyNames();
    abstract void mapProperties(Map<String, String> userInput);
}
class Ip extends Property {
    private String ip;
    private String port;
    public String getIp() {
        return this.ip;
    }
    public int getPort() {
        return Integer.parseInt(this.port);
    }
    Map<String, String> getPropertyNames() {
        Map<String, String> names = new HashMap<>();
        names.put("ip", "IP Address");
        names.put("port", "Port");
    }
    void mapProperties(Map<String, String> userInput) {
        for (Map.Entry<String, String> entry : userInput.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            if ("ip".equals(key)) {
                this.ip = value;
            } else if ("port".equals(key)) {
                this.port = value;
            }
        }
    }
}
GUI

class GUI {
    // psuedo code ahead, warning...
    buildForm() {

        Property p = Property.getInstance(userSelectedType);
        Map m = p.getPropertyNames();
        for (entry in map) {
           // build input type
           // add listener to set values
        }
   }
   void save() {
       // run through user input map
       // call p.mapProperties(userInputMap);
   }
}

注意,我在SO编辑器中输入这个,而不是在IDE中,它将 not 编译

看看Class.getDeclaredConstructor()(然后使用你得到的构造函数)或者可能只是Class.newInstance()取决于你的类是否提供构造函数。

见:https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html getDeclaredConstructor-java.lang.Class…

相关内容

  • 没有找到相关文章

最新更新