W dniu 08.12.2012 23:54, J-23 pisze:
> Witam
>
Trochę czasu mineło ale dopiero teraz znalazłem chwile by powrocic do
sprawy...
Zacząłem się bawić Javaassist
http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/tutorial/tutorial.html wygląda
fajnie i wydaje się spełnić moje oczekiwania tylko mam pewien problem.
public class SampleBean {
public SampleBean() {
super();
// TODO Auto-generated constructor stub
}
// Klasa generowana w trybie Runtime
}
Mam klase SampleBean którą w calosci widzicie wyżej chciałym za pomocą
Javaassist
wypełnić ja odpowiednimi metodami i potem wykorzystać dalej, wypełniam
ją następująco
ClassPool SampleBean = ClassPool.getDefault();
CtClass SampleBeanGenerator =
SampleBean.get("pl.cba.lukaszbaczek.SampleBean");
SampleBean.importPackage("com.extjs.gxt.ui.client.data");
SampleBean.importPackage("
java.io");
SampleBeanGenerator.setInterfaces(new CtClass[]
{SampleBean.makeClass("BeanModelTag"),
SampleBean.makeClass("Serializable")});
CtField serialVersionUID = CtField.make("private static final long
serialVersionUID = 1L;", SampleBeanGenerator);
CtField id = CtField.make("private int id;", SampleBeanGenerator);
CtField name = CtField.make("private String name;",
SampleBeanGenerator);
SampleBeanGenerator.addField(serialVersionUID);
SampleBeanGenerator.addField(id);
SampleBeanGenerator.addField(name);
CtMethod setId = CtNewMethod.make("public void setId(int id)
{
this.id = id;}", SampleBeanGenerator);
CtMethod getId = CtNewMethod.make("public int getId() {return
id;}", SampleBeanGenerator);
CtMethod setName = CtNewMethod.make("public void setName(String
name) {
this.name = name;}", SampleBeanGenerator);
CtMethod getName = CtNewMethod.make("public String getName()
{return name;}", SampleBeanGenerator);
CtMethod toString = CtNewMethod.make("public String toString()
{return \"id: \" + id + \", name: \" + name;}", SampleBeanGenerator);
CtMethod hashCode = CtNewMethod.make("public int hashCode() {final
int prime = 31; int result = 1; result = prime * result + id; result =
prime * result + ((name == null) ? 0 : name.hashCode()); return
result;}", SampleBeanGenerator);
CtMethod equals = CtNewMethod.make("public boolean equals(Object
obj) {if (this == obj) return true; if (obj == null) return false;
SampleBean other = (SampleBean) obj; if (id !=
other.id) return false;
if (name == null) {if (
other.name != null) return false;} else if
(!name.equals(
other.name)) return false; return true;}}",
SampleBeanGenerator);
SampleBeanGenerator.addMethod(setId);
SampleBeanGenerator.addMethod(getId);
SampleBeanGenerator.addMethod(setName);
SampleBeanGenerator.addMethod(getName);
SampleBeanGenerator.addMethod(toString);
SampleBeanGenerator.addMethod(hashCode);
SampleBeanGenerator.addMethod(equals);
SampleBeanGenerator.writeFile();
wiem ze by działało odpowiednio serializowanie w gridach Ext-GWT mozna
uzyć prostszych metod wspierając się biblioteką JSON (na potrzeby testow
sam tworze odpowiedniego JSON i stad te bardziej rozbudowane metody).
Przy probie kompilacji dostaje komunikat
Exception in thread "main" javassist.CannotCompileException: [source
error] no such class: SampleBean
at javassist.CtNewMethod.make(CtNewMethod.java:79)
at javassist.CtNewMethod.make(CtNewMethod.java:45)
at pl.cba.lukaszbaczek.Main.main(Main.java:47)
Caused by: compile error: no such class: SampleBean
at javassist.compiler.MemberResolver.searchImports(MemberResolver.java:465)
at javassist.compiler.MemberResolver.lookupClass(MemberResolver.java:409)
at
javassist.compiler.MemberResolver.lookupClassByJvmName(MemberResolver.java:319)
at
javassist.compiler.MemberResolver.resolveJvmClassName(MemberResolver.java:509)
at
javassist.compiler.MemberCodeGen.resolveClassName(MemberCodeGen.java:1145)
at javassist.compiler.CodeGen.atDeclarator(CodeGen.java:712)
at javassist.compiler.ast.Declarator.accept(Declarator.java:100)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351)
at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50)
at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292)
at javassist.compiler.CodeGen.atMethodDecl(CodeGen.java:274)
at javassist.compiler.ast.MethodDecl.accept(MethodDecl.java:44)
at javassist.compiler.Javac.compileMethod(Javac.java:169)
at javassist.compiler.Javac.compile(Javac.java:95)
at javassist.CtNewMethod.make(CtNewMethod.java:74)
... 2 more
na który to znalazłem odp na jednym z forum
https://community.jboss.org/message/303087
lecz jest tam linijka
CtNewClass generated = new CtNewClass(generatedName, pool, false,
superclass);
Ktora jest nie zgodna z bibliotek Javaasist i nie potrafię sobie z tym
poradzić
Pozdrawiam