🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #153694

Re: Dynamiczny kod Java

#153694
From: J-23
Date: Sat, 22 Dec 2012 19:35
119 lines
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-mail
References: <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