Create simple POJO classes (bytecode) at runtime (dynamically)

后端 未结 5 1214
遥遥无期
遥遥无期 2020-11-27 05:24

I\'ve the following scenario..

I am writing some tool that run user-entered query against the database and return the result..

The simplest way is to return

5条回答
  •  感情败类
    2020-11-27 06:04

    Creating a simple POJO with getters and setters is easy if you use CGLib:

    public static Class createBeanClass(
        /* fully qualified class name */
        final String className,
        /* bean properties, name -> type */
        final Map> properties){
    
        final BeanGenerator beanGenerator = new BeanGenerator();
    
        /* use our own hard coded class name instead of a real naming policy */
        beanGenerator.setNamingPolicy(new NamingPolicy(){
            @Override public String getClassName(final String prefix,
                final String source, final Object key, final Predicate names){
                return className;
            }});
        BeanGenerator.addProperties(beanGenerator, properties);
        return (Class) beanGenerator.createClass();
    }
    

    Test code:

    public static void main(final String[] args) throws Exception{
        final Map> properties =
            new HashMap>();
        properties.put("foo", Integer.class);
        properties.put("bar", String.class);
        properties.put("baz", int[].class);
    
        final Class beanClass =
            createBeanClass("some.ClassName", properties);
        System.out.println(beanClass);
        for(final Method method : beanClass.getDeclaredMethods()){
            System.out.println(method);
        }
    
    }
    

    Output:

    class some.ClassName
    public int[] some.ClassName.getBaz()
    public void some.ClassName.setBaz(int[])
    public java.lang.Integer some.ClassName.getFoo()
    public void some.ClassName.setFoo(java.lang.Integer)
    public java.lang.String some.ClassName.getBar()
    public void some.ClassName.setBar(java.lang.String)

    But the problem is: you have no way of coding against these methods, as they don't exist at compile time, so I don't know what good this will do you.

提交回复
热议问题