使用反射递归构造java对象的伪代码

使用反射递归构造java对象的伪代码,java,dynamic,reflection,Java,Dynamic,Reflection,我正在尝试为函数编写代码,以帮助我深入打印java代码,从而帮助我构造给定的新java pojo对象。 函数将获取类类型并打印初始化代码, 示例:对于具有两个int成员和一个String成员的类Foo: Class Foo int a,b; String c; 对helper函数的调用将是: void printCode(Foo.getClass()) 该函数将跟踪对象的所有setter,并将调用打印为文本,Foo类的函数输出为: Foo foo = new Foo


我正在尝试为函数编写代码,以帮助我深入打印java代码,从而帮助我构造给定的新java pojo对象。
函数将获取类类型并打印初始化代码,
示例:对于具有两个int成员和一个String成员的类Foo:

 Class Foo
     int a,b;
     String c;

对helper函数的调用将是:

 void printCode(Foo.getClass())

该函数将跟踪对象的所有setter,并将调用打印为文本,Foo类的函数输出为:

 Foo foo = new Foo();
 foo.setA();
 foo.setB();
 foo.setC();




此类(A、M、N)的另一个更复杂的示例:


函数签名将是:

void printCode(Class clazz)

对于起始类A,所需的程序输出将是(输出为字符串形式的java代码):


我能够完成99%的工作,停止条件应该是-要获得原语或字符串类型-否则对对象使用递归。。
我唯一缺少的是正确遍历setter的实际递归逻辑,需要伪代码帮助,如:

void **printCode**(Class clazz){
    list setters = getAllSetters(clazz);
    for each setter{
         list parameters = getAllParameters(setter);
              if not all parameters are primitive or string:
              for each setter{
                         if(parameter is not (String or primitive))
                                   **printCode**(parameter)
                             }
                }
             print construction code for the object here;
}


谢谢

我用您的伪代码创建了一个Java类。我希望这正是您想要的:

public class ReflectionPrinter {

public static void printCode(Class<?> clazz) {

    Constructor<?>[] cons = clazz.getConstructors();
    List<Method> setters = getAllSetters(clazz);

    for (Method setter : setters) {

        Class<?>[] params = setter.getParameterTypes();

        for (Class<?> param : params) {

            if (!isPrimitiveOrString(param)) {
                printCode(param);
            }
        }
    }

    // print out
    for (Constructor<?> con : cons) {
        System.out.println("new " + con.getName() + "()");
    }

    for (Method setter : setters) {
        System.out.println(clazz.getSimpleName() + "." + setter.getName() + "()");
    }

    // skip
    System.out.println();

}

public static List<Method> getAllSetters(Class<?> clazz) {
    List<Method> setters = new ArrayList<Method>();

    for (Method m : clazz.getMethods()) {
        if (m.getName().startsWith("set")) {
            setters.add(m);
        }
    }

    return setters;
}

public static boolean isPrimitiveOrString(Class<?> paramClass) {

    return paramClass.isPrimitive() || String.class.equals(paramClass);
}
公共类ReflectionPrinter{
公共静态无效打印代码(clazz类){
构造函数[]cons=clazz.getConstructors();
列表设置器=getAllsetter(clazz);
for(方法设置器:设置器){
类[]params=setter.getParameterTypes();
用于(类参数:参数){
如果(!isPrimitiveOrString(参数)){
打印代码(参数);
}
}
}
//打印出来
对于(构造函数con:cons){
System.out.println(“new”+con.getName()+“()”);
}
for(方法设置器:设置器){
System.out.println(clazz.getSimpleName()+“+setter.getName()+”);
}
//跳过
System.out.println();
}
公共静态列表getAllSetter(类clazz){
列表设置器=新的ArrayList();
对于(方法m:clazz.getMethods()){
if(m.getName().startsWith(“set”)){
增加(m);
}
}
返回设置器;
}
公共静态布尔isPrimitiveOrString(类paramClass){
返回paramClass.isPrimitive()| String.class.equals(paramClass);
}
如果还需要setter参数的参数名,可以使用Paranamer


另一种可能是使用AspectJ跟踪所有构造函数和/或setter调用。但是,它只打印实际调用的setter方法。在AspectJ中,有切入点特别适用于setter方法和设置变量。如果您需要帮助,我想我们可以找到正确的切入点。

s正在执行,setters的参数不可用。也许你应该看看getter?我只需要setters参数类型-它可用..抱歉,我误解了。我不理解你的实际问题。你想检查你的伪代码还是想将你的伪代码翻译成Java,还是只需要getAllPara的逻辑米(setter)?我在寻找一个想法,伪代码而不是代码,关于如何递归遍历对象并根据其setter打印信息。谢谢你,但不需要实际的代码,只是关于如何跟踪对象的伪代码。你在开玩笑吗?对你来说有什么区别?我应该删除修饰符还是什么?>:(我不知道您将如何处理它,但您可以使用伪代码的方式将其用作模板。在第二个示例中运行代码,它将无法正确打印。然后指定哪些内容无法正确打印,哪些内容应该正确打印。)printed@user648026如果你不描述你想要什么,没有人能帮你。
void **printCode**(Class clazz){
    list setters = getAllSetters(clazz);
    for each setter{
         list parameters = getAllParameters(setter);
              if not all parameters are primitive or string:
              for each setter{
                         if(parameter is not (String or primitive))
                                   **printCode**(parameter)
                             }
                }
             print construction code for the object here;
}
public class ReflectionPrinter {

public static void printCode(Class<?> clazz) {

    Constructor<?>[] cons = clazz.getConstructors();
    List<Method> setters = getAllSetters(clazz);

    for (Method setter : setters) {

        Class<?>[] params = setter.getParameterTypes();

        for (Class<?> param : params) {

            if (!isPrimitiveOrString(param)) {
                printCode(param);
            }
        }
    }

    // print out
    for (Constructor<?> con : cons) {
        System.out.println("new " + con.getName() + "()");
    }

    for (Method setter : setters) {
        System.out.println(clazz.getSimpleName() + "." + setter.getName() + "()");
    }

    // skip
    System.out.println();

}

public static List<Method> getAllSetters(Class<?> clazz) {
    List<Method> setters = new ArrayList<Method>();

    for (Method m : clazz.getMethods()) {
        if (m.getName().startsWith("set")) {
            setters.add(m);
        }
    }

    return setters;
}

public static boolean isPrimitiveOrString(Class<?> paramClass) {

    return paramClass.isPrimitive() || String.class.equals(paramClass);
}