Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Dynamiczny kod Java

85 views
Skip to first unread message

J-23

unread,
Dec 8, 2012, 5:54:12 PM12/8/12
to
Witam
Od kilku dni próbuje wykonać kod dynamiczny w Javie
Znalzałem coś takiego:

http://www.accordess.com/wpblog/an-overview-of-java-compilation-api-jsr-199/

Wygląda fajnie ale przy próbie kompilacji dostaję
Exception in thread "main" java.lang.NullPointerException
at com.accordess.ca.CompilerAPITest.doCompilation(CompilerAPITest.java:51)
at com.accordess.ca.CompilerAPITest.main(CompilerAPITest.java:84)


Nie bardzo wiem jak to naprawić, ktoś podpowie?

Pozdrawiam

J-23

unread,
Dec 8, 2012, 7:14:48 PM12/8/12
to
W dniu 08.12.2012 23:54, J-23 pisze:
> Witam
> Od kilku dni próbuje wykonać kod dynamiczny w Javie
> Znalzałem coś takiego:
>
> http://www.accordess.com/wpblog/an-overview-of-java-compilation-api-jsr-199/
>
>
> Wygląda fajnie ale przy próbie kompilacji dostaję
> Exception in thread "main" java.lang.NullPointerException
> at
> com.accordess.ca.CompilerAPITest.doCompilation(CompilerAPITest.java:51)
> at com.accordess.ca.CompilerAPITest.main(CompilerAPITest.java:84)
>

Po dodaniu pliku "tools.jar" z katalogu javy do projektu błąd zniknął
(brak jakiegokolwiek) tylko brak też wyniku w postaci napisu "Hello,
dynamic compilation world!"

> Pozdrawiam

Marcin Biegan

unread,
Dec 9, 2012, 5:18:17 AM12/9/12
to
On 2012-12-09 01:14, J-23 wrote:> Po dodaniu pliku "tools.jar" z katalogu javy
do projektu błąd zniknął
> (brak jakiegokolwiek) tylko brak też wyniku w postaci napisu "Hello,
> dynamic compilation world!"

Bo to kompiluje, a nie uruchamia.

Btw. zerknij na asm.ow2.org, może się przyda.
--
pozdrawiam
Marcin Biegan

Bogusław Szczepanowski

unread,
Dec 9, 2012, 8:53:28 AM12/9/12
to
Do błędów klasy SQL Injection należy dodać Java Injection?

Jak byś kompilował cokolwiek, co pochodzi z danych użytkownika, to oczyść
i wyescape'uj porządnie te dane ;)

--
Boguś
/Każdy skutek ma swoją przyczynę/

--- news://freenews.netfront.net/ - complaints: ne...@netfront.net ---

J-23

unread,
Dec 9, 2012, 11:35:55 AM12/9/12
to
W dniu 09.12.2012 11:18, Marcin Biegan pisze:
> On 2012-12-09 01:14, J-23 wrote:> Po dodaniu pliku "tools.jar" z
> katalogu javy do projektu błąd zniknął
> > (brak jakiegokolwiek) tylko brak też wyniku w postaci napisu "Hello,
> > dynamic compilation world!"
>
> Bo to kompiluje, a nie uruchamia.
>

Ok, doszedłem do tego samego wniosku ale jakbyś mógł mi pomóc w analizie
tego kodu bo nie wiem dlaczego nie wychodzi mi plik *.class

Pozdrawiam

J-23

unread,
Dec 22, 2012, 2:35:57 PM12/22/12
to
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


William Bonawentura

unread,
Dec 24, 2012, 1:35:11 AM12/24/12
to
> 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
> Przy probie kompilacji dostaje komunikat Exception in thread "main" javassist.CannotCompileException: [source error] no such
> class: SampleBean

W czasie kompilacji GWT nie istnieją twoje, tworzone w czasie wykonania klasy. Siłą rzeczy więc kompilator GWT nie może ich widzieć.
Mam ciągle wrażenie, że silnie komplikujesz jakiś problem :).

J-23

unread,
Dec 24, 2012, 9:40:19 AM12/24/12
to
W dniu 24.12.2012 07:35, William Bonawentura pisze:
Zgodze się z Tobą, że komplikuje, ale chce osiągnąć taką rzecz:

podając SQL mieć wynik tego SQL w Grid (wczesniej kombinowałem z MAP -
zakończone sukcesem) taki SQL Editor teraz chce to samo ale z użyciem
LiveGrida

Wiem ze mozesz mysleć że "kombinuje jak koń pod góre" bo sam zaczalem
sie zastanawiać sam już czy to jest do przeskoczenia

Pozdrawiam

William Bonawentura

unread,
Jan 2, 2013, 2:17:07 AM1/2/13
to


> podając SQL mieć wynik tego SQL w Grid (wczesniej kombinowałem z MAP - zakończone sukcesem) taki SQL Editor teraz chce to samo ale
> z użyciem LiveGrida

Zarówno z punktu widzenia twojego klienta jak i serwera, wynik "ad-hoc" zapytania SQL jest właśnie czymś w rodzaju mapy kolekcji
(bądź kolekcją map). I tego powinieneś się trzymać.

0 new messages