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

dynamiczne wykonanie kodu klasy

43 views
Skip to first unread message

Adam

unread,
May 31, 2006, 11:17:03 AM5/31/06
to
Witam
Mam program, w którym w czasie działania jest generowany kod klasy,
następnie jest przez runtime.exec("javac .."); kompilowany. Następnie
chcę za pomocą refleksji wykonać kod tej klasy, pojawia sie wyjątek:
java.lang.ClassNotFoundException: output - oczywiście wiem co on oznacza
i potrafię go normalnie rozwiązać. Czy istnieje możliwośc wykonania kodu
tej klasy bez zmiany zmiennej środowiskowej CLASSPATH? W ogóle gdy
próbuje wykonać runtime.exec("javac -d katalog output.java") to nie
kompiluje się to - może ktoś wie dlaczego? Bez -d jest ok.

zar...@poczta.onet.pl

unread,
May 31, 2006, 11:31:47 AM5/31/06
to

Raczej nie pomogę ale przyczepię się do Runtime.exec("javac...
O ile się nie mylę to w tools.jar masz klasy do robienia
tego (kompilowania) bez uciekania się do takich kombinacji.

Coś jeszcze, jeśli chcesz wywoływać metodę z takiej klasy
wiele razy to Reflection nie jest najbardziej wydajnym sposobem.

Pozdrawiam
zarafiq

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Brzezi

unread,
May 31, 2006, 11:56:20 AM5/31/06
to
śro, 31 maj 2006 o 17:17 GMT, Adam napisał(a):

> Czy istnieje możliwośc wykonania kodu
> tej klasy bez zmiany zmiennej środowiskowej CLASSPATH?

ClassLoader

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ Hey, Jim, it's me, Susie Lillis from ]
[ Ekg: #3781111 ][ the laundromat. You said you were ]
[ LinuxUser: #249916 ][ gonna call and it's been two weeks. ]
[ What's wrong, you lose my number? ]

Adam

unread,
May 31, 2006, 1:19:50 PM5/31/06
to
Udało mi się skompilować plik umieszczając go w katalogu jdk\bin jednak
próba odpalenia go końćzy się wyjątkiem:
java.lang.ClassNotFoundException: output
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
...
Kod:
ClassLoader cls = ClassLoader.getSystemClassLoader();
Object obj = Class.forName("output",false,cls).newInstance();

Niestety nie mam czasu szukać po dokumentacji, coś mi się wydaje, że
trzeba napisać własnego classloadera...

Brzezi

unread,
May 31, 2006, 1:49:55 PM5/31/06
to
śro, 31 maj 2006 o 19:19 GMT, Adam napisał(a):

> ClassLoader cls = ClassLoader.getSystemClassLoader();

Uzywasz klasy ClassLoader, ale widac ze nawet nie zajrzales do jej
dokumentacji...

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ If you stick your head in the sand, ]
[ Ekg: #3781111 ][ one thing is for sure, you're gonna ]
[ LinuxUser: #249916 ][ get your rear kicked. ]

Piotr Lipski

unread,
May 31, 2006, 2:41:13 PM5/31/06
to
>> ClassLoader cls = ClassLoader.getSystemClassLoader();
>
> Uzywasz klasy ClassLoader, ale widac ze nawet nie zajrzales do jej
> dokumentacji...

No przecież napisał, że nie ma czasu.

PL

Brzezi

unread,
May 31, 2006, 2:44:53 PM5/31/06
to
śro, 31 maj 2006 o 20:41 GMT, Piotr Lipski napisał(a):

> No przecież napisał, że nie ma czasu.

a traci czas na grupy dyskusyjne... :)
czyli chyba jednak z tym czasem nie jest tak zle u niego... :D

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ brzezi:~# uptime ]
[ Ekg: #3781111 ][ 20:44:22 up 37 days, 10:50, 3 users, ]
[ LinuxUser: #249916 ][ load average: 1.96, 2.26, 2.33 ]

Adam

unread,
May 31, 2006, 5:45:03 PM5/31/06
to
Brzezi wrote:
> śro, 31 maj 2006 o 20:41 GMT, Piotr Lipski napisał(a):
>
>> No przecież napisał, że nie ma czasu.
>
> a traci czas na grupy dyskusyjne... :)
> czyli chyba jednak z tym czasem nie jest tak zle u niego... :D
>

Napisałem classloadera, klasę załadowałem do jvm ale gdy chcę wywołać
jej metodę main dostaję taki oto wyjatek:
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)

albo:

java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)

jego sprawcą jest:
Object obj = Class.forName("output",true,cls).newInstance();
Method[] m = obj.getClass().getDeclaredMethods();
System.out.println(obj.getClass().getName());
for (int i=0;i<m.length;i++) {
System.out.println(m[i].getName());
if (m[i].getName().equals("main"))
m[i].invoke(obj,null);
}

Wiadomo, że main ma parametr String[] więc skad ten wyjątek? :|

Pozdrawiam,
Adam

Brzezi

unread,
May 31, 2006, 5:52:21 PM5/31/06
to
śro, 31 maj 2006 o 23:45 GMT, Adam napisał(a):

>>> No przecież napisał, że nie ma czasu.
>> a traci czas na grupy dyskusyjne... :)
>> czyli chyba jednak z tym czasem nie jest tak zle u niego... :D
> Napisałem classloadera,

po co? widac ze dalej nie zajrzales do dokumentacji? a pisales ze nie masz
czasu, a juz tyle czasu zmarnowales, a w ClassLoaderze jest to juz
gotowe...

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ brzezi:~# uptime ]

[ Ekg: #3781111 ][ 23:51:29 up 37 days, 13:57, 3 users, ]
[ LinuxUser: #249916 ][ load average: 2.27, 2.38, 2.47 ]

Adam

unread,
May 31, 2006, 5:56:50 PM5/31/06
to
Brzezi wrote:
> śro, 31 maj 2006 o 23:45 GMT, Adam napisał(a):
>
>>>> No przecież napisał, że nie ma czasu.
>>> a traci czas na grupy dyskusyjne... :)
>>> czyli chyba jednak z tym czasem nie jest tak zle u niego... :D
>> Napisałem classloadera,
>
> po co? widac ze dalej nie zajrzales do dokumentacji? a pisales ze nie masz
> czasu, a juz tyle czasu zmarnowales, a w ClassLoaderze jest to juz
> gotowe...
>
No to mistrzu napisz która metoda z classloadera rozwiąże mój problem z
wywołaniem metody main :>?

Pozdrawiam,
Adam

Brzezi

unread,
May 31, 2006, 6:02:37 PM5/31/06
to
śro, 31 maj 2006 o 23:56 GMT, Adam napisał(a):

>>>>> No przecież napisał, że nie ma czasu.
>>>> a traci czas na grupy dyskusyjne... :)
>>>> czyli chyba jednak z tym czasem nie jest tak zle u niego... :D
>>> Napisałem classloadera,
>> po co? widac ze dalej nie zajrzales do dokumentacji? a pisales ze nie masz
>> czasu, a juz tyle czasu zmarnowales, a w ClassLoaderze jest to juz
>> gotowe...
> No to mistrzu napisz która metoda z classloadera rozwiąże mój problem z
> wywołaniem metody main :>?

miales problem z zaladowaniem klasy, *Z PLIKU*, gdy plik jest zbednym i
klopotliwym krokiem jezeli klasa jest generowana dynamicznie, w ww. klasie
masz metody do ladowania klasy prosto z "bajtow"

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ ]
[ Ekg: #3781111 ][ ]
[ LinuxUser: #249916 ][ ]

Brzezi

unread,
May 31, 2006, 6:04:52 PM5/31/06
to
śro, 31 maj 2006 o 23:45 GMT, Adam napisał(a):

> m[i].invoke(obj,null);

pomijajac reszte, to metoda main wymaga tablicy String[], a ty jej dajesz
null...

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ ]
[ Ekg: #3781111 ][ ]
[ LinuxUser: #249916 ][ ]

Adam

unread,
May 31, 2006, 6:06:29 PM5/31/06
to
Brzezi wrote:
> śro, 31 maj 2006 o 23:45 GMT, Adam napisał(a):
>
>> m[i].invoke(obj,null);
>
> pomijajac reszte, to metoda main wymaga tablicy String[], a ty jej dajesz
> null...
>

Sorki - zły fragment kodu wkleiłem. Jak wstawię tam String[] to mam:

Brzezi

unread,
May 31, 2006, 6:13:14 PM5/31/06
to
czw, 01 cze 2006 o 00:06 GMT, Adam napisał(a):

> Sorki - zły fragment kodu wkleiłem. Jak wstawię tam String[] to mam:
>
> java.lang.IllegalArgumentException: wrong number of arguments

a kod? niestety nie wymyslono jeszcze sposobu deexceptionizacji
wyjatku do kodu zrodlowego...

Pozdrawiam
Brzezi
--
[ E-mail: brz...@enter.net.pl ][ GEEK CODE [Version: 3.12]: GCM dpu s+:- ]
[ Ekg: #3781111 ][ a--- C+++ UL++ P+ L+++ E--- W+++ N+++ ]
[ LinuxUser: #249916 ][ o-- K- w--- O-- M- V- PS PE Y PGP--- t+ ]
[ 5- X++ R* tv+ b- DI- D+ G+ e- h! r y-- ]

Piotr Kobzda

unread,
Jun 1, 2006, 3:10:39 AM6/1/06
to
Brzezi wrote:

> czw, 01 cze 2006 o 00:06 GMT, Adam napisał(a):
>
>>Sorki - zły fragment kodu wkleiłem. Jak wstawię tam String[] to mam:
>>
>>java.lang.IllegalArgumentException: wrong number of arguments
>
> a kod? niestety nie wymyslono jeszcze sposobu deexceptionizacji
> wyjatku do kodu zrodlowego...

Tymczasem podejrzewać można, że źródło jest jakieś takie:

m[i].invoke(obj, new String[0]);

Javka uznaje podaną tablicę za zgodną z Object[], w efekcie invoke widzi
na wejściu zero argumentów, a oczekuje przecież jednego. Rozwiązanie
wyglądać może tak:

m[i].invoke(obj, new Object[]{ new String[0] });


piotr

lip...@gmail.com

unread,
Jun 1, 2006, 3:29:07 AM6/1/06
to
> > No przecież napisał, że nie ma czasu.
>
> a traci czas na grupy dyskusyjne... :)
> czyli chyba jednak z tym czasem nie jest tak zle u niego... :D

i nie czyta odpowiedzi:

http://groups.google.pl/group/pl.comp.lang.java/msg/bd0cd7eb5bdc68c4?dmode=source

Gdyby przeczytał to by wiedział jak można dynamicznie utworzyć,
załadować i wykonac metodę klasy.

PL

Piotr Kobzda

unread,
Jun 1, 2006, 4:05:13 AM6/1/06
to
lip...@gmail.com wrote:

> i nie czyta odpowiedzi:

A kiedy? Przecież pisał, że nie ma czasu.

> http://groups.google.pl/group/pl.comp.lang.java/msg/bd0cd7eb5bdc68c4?dmode=source
>
> Gdyby przeczytał to by wiedział jak można dynamicznie utworzyć,
> załadować i wykonac metodę klasy.

W całym tamtym wątku odpowiedzi wiele na to dostał.

ASM jest miły, sam go od dłuższego czasu używam i wiele razy polecałem,
wymaga jednak znajomości asemblera Javy, co raczej zgodzisz się, że dla
początkujących z Javą może być dość trudne, prawda?

Zacznie przystępniejsze są sugestie, z których częściowo chociaż
spróbował skorzystać, pomimo, że osobiście użyłbym raczej gotowca (on
the fly) autorstwa Roedy'ego Green'a, którego tam wskazałem.

Choć i tak najciekawszy do tego myślę będzie JavaCompilerTool z 1.6, nie
wiesz może czy już działa? Miał ponoć pozwolić na kompilację bez zapisu
na dysk...


Pozdrawiam i miłego dnia życzę!
piotr

Adam

unread,
Jun 1, 2006, 6:09:28 AM6/1/06
to
Piotr Kobzda wrote:

>
> m[i].invoke(obj, new Object[]{ new String[0] });

Dzieki wielkie - poszło.

Pozdrawiam,
Adam

Piotr Kobzda

unread,
Jun 1, 2006, 9:41:21 AM6/1/06
to
Piotr Kobzda wrote:
> lip...@gmail.com wrote:
[...]

> Choć i tak najciekawszy do tego myślę będzie JavaCompilerTool z 1.6, nie
> wiesz może czy już działa? Miał ponoć pozwolić na kompilację bez zapisu
> na dysk...

No więc zabawiłem się sam, no i z 1.6 beta2 działa (przykład poniżej).


piotr

--

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.tools.DiagnosticMessage;
import javax.tools.JavaCompilerTool;
import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.ToolProvider;
import javax.tools.WrapperJavaFileManager;
import javax.tools.JavaFileObject.Kind;

public class OnTheFlyInRAM {

static JavaFileObject generateJavaSourceCode() {

final String source = "public class Hello {\n" +
"public static void main(String... args) {\n" +
"System.out.println(\"just hello!\");\n" +
"}\n" +
"}";

return new SimpleJavaFileObject("Hello", JavaFileObject.Kind.SOURCE) {

public CharSequence getCharContent(boolean ignoreEncodingErrors)
throws IOException, IllegalStateException,
UnsupportedOperationException {
return source;
}

@Override
public long lengthInBytes() {
return -1;
}

public InputStream openInputStream() throws IOException,
IllegalStateException, UnsupportedOperationException {
throw new UnsupportedOperationException();
}

public OutputStream openOutputStream() throws IOException,
IllegalStateException, UnsupportedOperationException {
throw new UnsupportedOperationException();
}

};
}


static class SimpleRAMFileObject extends SimpleJavaFileObject {

SimpleRAMFileObject(String name, Kind kind) {
super(name, kind);
}

ByteArrayOutputStream baos;

public CharSequence getCharContent(boolean ignoreEncodingErrors)
throws IOException, IllegalStateException,
UnsupportedOperationException {
throw new UnsupportedOperationException();
}

@Override
public long lengthInBytes() {
return baos == null ? 0 : baos.size();
}

public InputStream openInputStream() throws IOException,
IllegalStateException, UnsupportedOperationException {
return new ByteArrayInputStream(baos.toByteArray());
}

public OutputStream openOutputStream() throws IOException,
IllegalStateException, UnsupportedOperationException {
return baos = new ByteArrayOutputStream();
}

}


public static void main(String[] args) throws Exception {

JavaCompilerTool compiler = ToolProvider.defaultJavaCompiler();

final Map<String, JavaFileObject> output = new HashMap<String,
JavaFileObject>();

JavaFileManager jfm = new
WrapperJavaFileManager(compiler.getStandardFileManager()) {

@Override
public JavaFileObject getFileForOutput(String name, Kind kind,
JavaFileObject sibling) throws IOException,
UnsupportedOperationException, IllegalArgumentException {
JavaFileObject jfo = new SimpleRAMFileObject(name, kind);
output.put(name, jfo);
return jfo;
}

};
compiler.setFileManager(jfm);

JavaCompilerTool.CompilationTask task
= compiler.run(null, generateJavaSourceCode());

if (! task.getResult()) {
for(DiagnosticMessage dm : task.getDiagnostics())
System.err.println(dm);
throw new RuntimeException("Compilation failed");
}

ClassLoader cl = new ClassLoader() {

@Override
protected Class<?> findClass(String name) throws
ClassNotFoundException {
JavaFileObject jfo = output.get(name);
if (jfo != null) {
byte[] bytes = ((SimpleRAMFileObject)jfo).baos.toByteArray();
return defineClass(name, bytes, 0, bytes.length);
}
return super.findClass(name);
}

};

Class<?> c = Class.forName("Hello", false, cl);
c.getMethod("main", String[].class)
.invoke(null, new Object[] {args});

}

}

Seweryn Habdank-Wojewódzki

unread,
Jun 2, 2006, 5:54:38 AM6/2/06
to
Witam

Piotr Kobzda wrote:

> Piotr Kobzda wrote:
>> lip...@gmail.com wrote:
> [...]
>> Choć i tak najciekawszy do tego myślę będzie JavaCompilerTool z 1.6, nie
>> wiesz może czy już działa? Miał ponoć pozwolić na kompilację bez zapisu
>> na dysk...
>
> No więc zabawiłem się sam, no i z 1.6 beta2 działa (przykład poniżej).

W Twoim kodzie znalazłem, że pracujesz z adnotacjami. Proszę podaj mi jakieś
namiary na dobry opis z przykładami a'propos tego tematu. To co jest na
stronach SUN to jest tragicznie niski poziom - w zasadzie z opisu niewiadomo
jakie one tak naprawdę mają możliwości. Chciałbym też zapytać, czy spotkałeś
się z metaprogramem z wykorzystaniem adnotacji?

Pozdrawiam.

--

|\/\/| Seweryn Habdank-Wojewódzki
`\/\/

Piotr Kobzda

unread,
Jun 2, 2006, 7:18:55 AM6/2/06
to
Seweryn Habdank-Wojewódzki wrote:

> W Twoim kodzie znalazłem, że pracujesz z adnotacjami.

Jak dotąd, to praca moja z adnotacjami kończy się głównie na użyciu
@Override i @SuppressWarnings. Pierwsza adnotacja bardziej z uwagi na
pośpiech (po prostu Eclipse sam to dodaje, a mi to nie przeszkadza, a i
kiedyś _wierzę_, że może pomagać zacznie), druga czasem z generykami
przydaje mi się.
Szerzej nie wykorzystywałem ich jeszcze.

> Proszę podaj mi jakieś
> namiary na dobry opis z przykładami a'propos tego tematu. To co jest na
> stronach SUN to jest tragicznie niski poziom - w zasadzie z opisu niewiadomo
> jakie one tak naprawdę mają możliwości.

Hmm, akurat ja poznawałem adnotacje w oparciu o materiały Sun'a i za
niezłe je uważam. Najważniejsze to oczywiście rozdziały 9.6 i 9.7 z JLS
(3). Reszta wiedzy siedzi już w API i toolsdocs (apt).

Niezły wstępniak z przykładami masz też tu:
http://mindprod.com/jgloss/annotations.html

A i sporo materiałów widziałem na onjava.com (niezłe są np. artykuły o
przetwarzaniu adnotacji ASMem).


> Chciałbym też zapytać, czy spotkałeś
> się z metaprogramem z wykorzystaniem adnotacji?

Osobiście tylko, jak dotąd, eksperymentalnie (ASM właśnie i kilka prób z
APTem).

Kilka osób tutaj pamiętam, że mocno używa, chwaląc sobie (ba, gdzieś tu
niedawno czytałem nawet, że to największa rewolucja 1.5) i być może ja
też do nich niedługo dołączę. Aktualnie jednak mogę szczerze powiedzieć,
że adnotacje są bardziej miłym dodatkiem dla mnie, niż niezbędnym
elementem języka. Oczywiście gdy znajdzie się projekt, w którym ich
szersze wykorzystanie za wskazane uznam, to nie będę się bronić. :)


HTH,
piotr

Piotr Lipski

unread,
Jun 2, 2006, 8:06:08 AM6/2/06
to
> W Twoim kodzie znalazłem, że pracujesz z adnotacjami. Proszę podaj mi jakieś
> namiary na dobry opis z przykładami a'propos tego tematu. To co jest na
> stronach SUN to jest tragicznie niski poziom - w zasadzie z opisu niewiadomo

Przesadzasz z tym niskim poziomem.

ciekawy blog dotyczący annotations:
http://blogs.sun.com/roller/page/gbracha?entry=annotations_toward_pluggable_types

praktyczne zastosowanie to oczywiście EJB 3.0.

poniżej artykulik o Java Persistence API:
http://java.sun.com/developer/technicalArticles/J2EE/jpa/

> jakie one tak naprawdę mają możliwości. Chciałbym też zapytać, czy spotkałeś
> się z metaprogramem z wykorzystaniem adnotacji?

Metaprogramowanie z wykorzystaniem tylko adnotacji nie jest możliwe. Trzeba
się posiłkować, jak napisał PK, na przykład ASMem.

PL

--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Piotr Lipski

unread,
Jun 2, 2006, 8:16:51 AM6/2/06
to
> Choć i tak najciekawszy do tego myślę będzie JavaCompilerTool z 1.6, nie
> wiesz może czy już działa? Miał ponoć pozwolić na kompilację bez zapisu
> na dysk...

Działa.
Często kompiluję pojedyncze klasy z linii poleceń. Uruchamianie javaca na moim
dość antycznym komputerku było powolne. Żeby sobie ulżyć napisałem coś takiego:
serwer kompilujący javax.tools <-komunikacja po gniazdach-> programik w c
udającu javaca. Zysk był - odpało każdorazowe ładownia JVM i potrzebnych klas.
Piszę był - jakiś czas temu zmienili API i przestało działać. Na razie nie
poprawiam - czekam na stabilizację.

Seweryn Habdank-Wojewódzki

unread,
Jun 2, 2006, 5:19:08 PM6/2/06
to
Witam

Piotr Lipski wrote:

> Metaprogramowanie z wykorzystaniem tylko adnotacji nie jest możliwe. Trzeba
> się posiłkować, jak napisał PK, na przykład ASMem.

Zapytałem, bo na stronie Sun jest napisane że da się, nie napisali, że coś
jeszcze potrzeba i dlatego jakoś mi się nic nie kleiło w głowie.

Seweryn Habdank-Wojewódzki

unread,
Jun 2, 2006, 5:20:01 PM6/2/06
to
Witam

Piotr Kobzda wrote:

> Niezły wstępniak z przykładami masz też tu:
> http://mindprod.com/jgloss/annotations.html

O właśnie dzięki.

Seweryn Habdank-Wojewódzki

unread,
Jun 2, 2006, 5:52:38 PM6/2/06
to
Witam

Piotr Lipski wrote:

Dzięki.



> praktyczne zastosowanie to oczywiście EJB 3.0.

To się wczytam.

>> jakie one tak naprawdę mają możliwości. Chciałbym też zapytać, czy spotkałeś
>> się z metaprogramem z wykorzystaniem adnotacji?
>
> Metaprogramowanie z wykorzystaniem tylko adnotacji nie jest możliwe. Trzeba
> się posiłkować, jak napisał PK, na przykład ASMem.

Jak już kiedyś pisałem z Javy jestem średni. Ale projektując z kolegą
bibliotekę obliczeniową zastanawiałem się jak np. wyznaczyć typ zawierający
zadane typy. Np. matematycznie myśląc int * double = double, czyli oczywiście
double zawiera int. A co jeżeli mam np. klasę liczby zespolone takie, że |z| <
1, ale rzuca wyjątki kiedy |z| przekroczy 1 i mnożę typ przez int. w wyniku
powinienem dostać klasę liczby zespolone ograniczone do zakresu intów. I do
takich celów używa się czasami metaprogramowania. Czyli system (oczywiście
prowadzony przez programistę) wybiera sobie odpowiedni typ wynikowy. I teraz
pytanie czy anotations potrafią takie coś uszyć. Załóżmy, że mamy klasę Z,
która jest uzbrojona w parametr promienia i kiedy użyję jakiegoś cuda na tej
klasie i na int to oczywiście pod kontrolą programisty, ale może dałoby się,
aby program sam się zorientował, że wynikiem operacji będzie typ zespolony o
zakresie większym. Mówię o kontroli programisty ze względu na to, że istnieje
szansa, że nieświdomie mnożymy int przez taką klasę zespoloną i wtedy
faktycznie nie powinny zostać poszerzone zakresy i powinien program rzucać
wyjątki. Jednak załóżmy, że jesteśmy świadomi działań.

Jarek Ratajski

unread,
Jun 5, 2006, 1:23:33 AM6/5/06
to
Piotr Kobzda wrote:
>
> Osobiście tylko, jak dotąd, eksperymentalnie (ASM właśnie i kilka prób z
> APTem).
>
> Kilka osób tutaj pamiętam, że mocno używa, chwaląc sobie (ba, gdzieś tu
> niedawno czytałem nawet, że to największa rewolucja 1.5) i być może ja
> też do nich niedługo dołączę. Aktualnie jednak mogę szczerze powiedzieć,
> że adnotacje są bardziej miłym dodatkiem dla mnie, niż niezbędnym
> elementem języka. Oczywiście gdy znajdzie się projekt, w którym ich
> szersze wykorzystanie za wskazane uznam, to nie będę się bronić. :)
>

Ja używałem tego już troche (własne annotacje do generowania dodatkowych
klas podczas buildowania, sprawdzanie runtime) i jest fajnie.
Aczkolwiek z robieniem dalszych rzeczy wstrzymałem się do wersji mustang.
Albowiem:
W tej chwili APT tool udostępnia tzw. mirror API - które jest
odpowiednikiem reflection API ale dostosowanym do plików źródłowych.
Aż się prosi aby te dwa API były zunifikowane (inaczej trzeba od nowa
pisać takie rzeczy jak np. rozpoznawianie bean properties(po nazwach)).
No i dodatkowo fajnie by było aby zamiast odpalania APT toola można
było podać plugin do kompilatora. (jakiś czas temu obiecywali, że coś z
tego wpadnie do mustanga - chociaż zdaje mi się, że nie widzę... tego
ciągle)
--
jarekr

0 new messages