Article View: pl.comp.lang.java
Article #153694Re: Dynamiczny kod Java
From: J-23
Date: Sat, 22 Dec 2012 19:35
Date: Sat, 22 Dec 2012 19:35
119 lines
6034 bytes
6034 bytes
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
Technical Details
Message-ID:
<kb52f4$5bn$1@mx1.internetia.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.supermedia.pl!news.nask.pl!news.nask.org.pl!news.internetia.pl!not-for-mailReferences:
<ka0gqa$61k$1@mx1.internetia.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.supermedia.pl!news.nask.pl!news.nask.org.pl!news.internetia.pl!not-for-mail From: J-23 <baczeklu@o2.pl> Newsgroups: pl.comp.lang.java Subject: Re: Dynamiczny kod Java Date: Sat, 22 Dec 2012 20:35:57 +0100 Organization: Netia S.A. Lines: 121 Message-ID: <kb52f4$5bn$1@mx1.internetia.pl> References: <ka0gqa$61k$1@mx1.internetia.pl> NNTP-Posting-Host: 77-253-127-226.adsl.inetia.pl Mime-Version: 1.0 X-Trace: mx1.internetia.pl 1356205348 5495 77.253.127.226 (22 Dec 2012 19:42:28 GMT) X-Complaints-To: abuse@inetia.pl NNTP-Posting-Date: Sat, 22 Dec 2012 19:42:28 +0000 (UTC) In-Reply-To: <ka0gqa$61k$1@mx1.internetia.pl> X-Tech-Contact: usenet@internetia.pl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 X-Server-Info: http://www.internetia.pl/ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit