Reflection 按名称检索属性

Reflection 按名称检索属性,reflection,binding,javafx-2,Reflection,Binding,Javafx 2,我正在努力为javafx创建一个动态视图生成实用程序。我有几个类有ObjectProperty或StringProperty,我想为每个属性创建一个ComboBox,如果可能的话,直接将combo selected值按名称绑定到Class属性。在javafx.beans.binding中是否有一些帮助程序或方法允许我指定对象和字符串名称并检索属性。或者只检索属性列表。我现在有了一个方法,它接受字符串并按名称将其与属性相匹配,但它要求我对对象上的每个属性都有一个大小写,这对于一个具有20多个属性的

我正在努力为javafx创建一个动态视图生成实用程序。我有几个类有ObjectProperty或StringProperty,我想为每个属性创建一个ComboBox,如果可能的话,直接将combo selected值按名称绑定到Class属性。在javafx.beans.binding中是否有一些帮助程序或方法允许我指定对象和字符串名称并检索属性。或者只检索属性列表。我现在有了一个方法,它接受字符串并按名称将其与属性相匹配,但它要求我对对象上的每个属性都有一个大小写,这对于一个具有20多个属性的对象来说是大量重复代码


我想指定javafx.bean.property作为返回类型。

查看ApacheCommonsBeanUtils

你说你想

获取属性的值:

获取属性列表:

这里还有很多其他有用的方法,对于UI工作来说,它们特别方便,因为它们中的许多方法返回的是您想要显示的字符串形式

如果需要对象而不是字符串,请改用PropertUtils类

获取属性的值(不是作为字符串)

获取属性列表: 您可以随时使用

获取属性列表

for (Method method : Node.class.getMethods()) {
    String name = method.getName();
    if (name.endsWith("Property")) {
        Type returnType = method.getReturnType();
        String propName = name.replace("Property", "");
        System.out.println(propName + " : " + returnType);
    }
}
以下是绑定的反射方法和示例:

public class ReflectiveBind extends Application {
    /**
     * Reflection call for code like
     * slider1.valueProperty().bindBidirectional(slider2.valueProperty());
     *
     * @param bindee Node which you want to be changed by binding
     * @param propertyName name of the property, e.g. width
     * @param bindTarget Node which you want to be updated by binding
     */
    private static void bind(Object bindee, String propertyName, Object bindTarget) throws Exception {
        // here we get slider1.valueProperty()
        Method methodForBindee = bindee.getClass().getMethod(propertyName + "Property", (Class[]) null);
        Object bindableObj = methodForBindee.invoke(bindee);

        // here we get slider2.valueProperty()
        Method methodForBindTarget = bindTarget.getClass().getMethod(propertyName + "Property", (Class[]) null);
        Object bindTargetObj = methodForBindTarget.invoke(bindTarget);

        // here we call bindBidirectional: slider1.valueProperty().bindBidirectional(slider2.valueProperty())
        Method bindMethod = bindableObj.getClass().getMethod("bindBidirectional", Property.class);
        bindMethod.invoke(bindableObj, bindTargetObj);
    }

    @Override
    public void start(Stage stage) {

        Slider slider1 = new Slider();
        Slider slider2 = new Slider();

        VBox root = new VBox(20);
        root.getChildren().addAll(slider1, slider2);

        stage.setScene(new Scene(root, 200, 100));
        stage.show();

        try {
            //same call as slider1.valueProperty().bindBidirectional(slider2.valueProperty());
            bind(slider1, "value", slider2);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) { launch(); }
}

除非有更多的方法,否则您链接的两个方法不会接近我要查找的方法,因为它们返回的是字符串,而不是属性。返回的是javafx.bean.property。绑定方法看起来不错。我试过了,但是遇到了一个异常,而且它不是双向的。我还没有完全剖析整个逻辑,所以我还不确定我可以做哪些更改来满足我的需要。我已经更改了调用双向绑定的方法,添加了javadoc,并提供了一个演示用法的应用程序。