Flask-Wtforms QuerySelectField, Слишком много значений для распаковки ошибок [дубликат]

Для тех, кому нужен пример прямого кода в Java 7:

Dog класс:

package com.mypackage.bean;

public class Dog {
    private String name;
    private int age;

    public Dog() {
        // empty constructor
    }

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void printDog(String name, int age) {
        System.out.println(name + " is " + age + " year(s) old.");
    }
}

ReflectionDemo класс:

package com.mypackage.demo;

import java.lang.reflect.*;

public class ReflectionDemo {

    public static void main(String[] args) throws Exception {
        String dogClassName = "com.mypackage.bean.Dog";
        Class dogClass = Class.forName(dogClassName); // convert string classname to class
        Object dog = dogClass.newInstance(); // invoke empty constructor

        String methodName = "";

        // with single parameter, return void
        methodName = "setName";
        Method setNameMethod = dog.getClass().getMethod(methodName, String.class);
        setNameMethod.invoke(dog, "Mishka"); // pass arg

        // without parameters, return string
        methodName = "getName";
        Method getNameMethod = dog.getClass().getMethod(methodName);
        String name = (String) getNameMethod.invoke(dog); // explicit cast

        // with multiple parameters
        methodName = "printDog";
        Class[] paramTypes = {String.class, int.class};
        Method printDogMethod = dog.getClass().getMethod(methodName, paramTypes);
        printDogMethod.invoke(dog, name, 3); // pass args
    }
}

Выход: Mishka is 3 year(s) old.


Вы можете вызвать конструктор с параметрами следующим образом:

Constructor dogConstructor = dogClass.getConstructor(String.class, int.class);
Object dog = dogConstructor.newInstance("Hachiko", 10);

В качестве альтернативы вы можете удалить

String dogClassName = "com.mypackage.bean.Dog";
Class dogClass = Class.forName(dogClassName);
Object dog = dogClass.newInstance();

и do

Dog dog = new Dog();

Method method = Dog.class.getMethod(methodName, ...);
method.invoke(dog, ...);

Предлагаемое чтение: Создание новых экземпляров класса

1
задан Wayne Werner 20 January 2018 в 07:10
поделиться

1 ответ

Исходя из патча, с которым связан pjcunningham, поскольку wtforms еще не выпустил это обновление, я пошел вперед и создал свою собственную monkeypatch:

import wtforms_sqlalchemy.fields as f                                                                                                                                                                                                                                                                    
def get_pk_from_identity(obj):
    cls, key = f.identity_key(instance=obj)[:2]
    return ':'.join(f.text_type(x) for x in key)                             
f.get_pk_from_identity = get_pk_from_identity

Plopping, что в моей кодовой базе достаточно, чтобы работать пока они не сократят выпуск, который работает с новейшей версией SQLAlchemy.

2
ответ дан Wayne Werner 17 August 2018 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: