2011-08-04 43 views
4

我试图实时生成一些类,下面是我的初步尝试:java的帮助新手的问题

ClassPool cp = ClassPool.getDefault(); 
    cp.insertClassPath(new ClassClassPath(Main.class)); 
    CtClass entity = cp.makeClass("Entity"); 
    try { 
     CtField id = new CtField(CtClass.intType, "id", entity); 

     entity.addField(id); 
     entity.addField(CtField.make(" public String name;", entity)); 
     entity.addMethod(CtNewMethod.make("public void say() { System.out.println(12222);}",entity)); 
     Class EntityClass = entity.toClass(); 
     entity.writeFile("/tmp"); 
     Object e= EntityClass.newInstance(); 
     Field name = EntityClass.getField("name"); 
     name.set("Ooldooz", e); 
     System.out.println(name.get(e)); 
    } catch (CannotCompileException e) { 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

但我面临一个类加载器的问题:

在线程异常“main”java.lang.IllegalArgumentException:无法将java.lang.String字段Entity.name设置为java.lang.String at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) at sun.reflect.UnsafeFieldAccessorImpl .throwSetIllegalArgumentExc主器件接收(UnsafeFieldAccessorImpl.java:150) 在sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37) 在sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:57) 在java.lang.reflect.Field中。设置(Field.java:657) 在Main.test(Main.java:26)

有关如何解决此问题的任何想法?

回答

2

Field#set将对象作为第一个参数,将值作为第二个参数。

你是这样称呼它的。

更改为name.set(e, "Ooldooz");