Search code examples
javajcodemodel

How to generate a generic method with JCodeModel?


I need to generate a generic method like

public static <T extends SomeObject> T get(Class<T> type) {
    ...
    return null;
}

Anybody done this before?


Solution

  • The key is the JMethod#generify method:

    import com.sun.codemodel.CodeWriter;
    import com.sun.codemodel.JClass;
    import com.sun.codemodel.JCodeModel;
    import com.sun.codemodel.JDefinedClass;
    import com.sun.codemodel.JExpr;
    import com.sun.codemodel.JMethod;
    import com.sun.codemodel.JMod;
    import com.sun.codemodel.JPackage;
    import com.sun.codemodel.JType;
    import com.sun.codemodel.writer.SingleStreamCodeWriter;
    
    public class CreateGenericMethodTest
    {
        public static void main(String[] args) throws Exception
        {
            JCodeModel codeModel = new JCodeModel();
            JPackage jpackage = codeModel._package("com.example");
            JDefinedClass jclass = jpackage._class("Example");
    
            JType genericType = codeModel.directClass("T");
            JMethod jmethod =
                jclass.method(JMod.PUBLIC | JMod.STATIC, genericType, "get");
            jmethod.generify("T", Number.class);
            JClass parameterType = codeModel.ref(Class.class).narrow(genericType);
            jmethod.param(parameterType, "type");
    
            jmethod.body()._return(JExpr.ref("null"));
            CodeWriter codeWriter = new SingleStreamCodeWriter(System.out);
            codeModel.build(codeWriter);
        }
    }
    

    Output:

    package com.example;
    
    public class Example {
    
        public static<T extends Number >T get(Class<T> type) {
            return null;
        }
    
    }
    

    (I used Number as the bound, but you can choose it arbitrarily)