This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
laboratoare:reflection [2015/01/05 13:02] cosmin.boaca [Exerciții] |
laboratoare:reflection [2015/01/07 00:28] (current) cosmin.boaca [Java Native Interface (JNI)] |
||
---|---|---|---|
Line 19: | Line 19: | ||
<code java NativeMethodDeclaration.java> | <code java NativeMethodDeclaration.java> | ||
- | private int native_add(int num1, int num2); | + | package laborator; |
+ | |||
+ | class NativeTest { | ||
+ | private int nativeAdd(int num1, int num2); | ||
+ | } | ||
</code> | </code> | ||
- | Declararea și definirea funcției in C este ceva mai complicată și nu va fi prezentată. | + | Functia in C/C++ trebuie sa aiba urmatoarea definite |
+ | |||
+ | <code C> | ||
+ | extern "C" { | ||
+ | Java_laborator_NativeTest_nativeAdd(JNIEnv *env, JObject obj, Jint a, Jint b) { | ||
+ | return a + b; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Numele metodei in C derivă din numele fully qualified al metodei din Java. (nume_pachet.nume_clasa.nume_metoda). Pentru metoda de mai sus, acest nume este laborator.NativeTest.nativeAdd. | ||
+ | Numele metodei din C se formeaza prin concatenarea Java_ la numele metodei în care . este inlocuit cu _ . | ||
+ | Metoda va fi compilată într-o bibliotecă partajată (shared_library) cu linking de C (extern "C"), acest lucru fiind necesar pentru a putea fi găsită corect din Java. | ||
==Reflection== | ==Reflection== | ||
Line 193: | Line 210: | ||
- **(2p)** Creati clasa ''ReflectionDummy'', o clasă care va conține 3 membri de tipul int, unul private, unul protected și unul public. Creați un obiect din această clasă și setați valorile membrilor folosind API-ul pentru Reflection. Folosiți metoda ''getDeclaredFields'' din clasa ''Class'', și metodele ''setAccessible'' respectiv ''set'' din clasa ''Field''. | - **(2p)** Creati clasa ''ReflectionDummy'', o clasă care va conține 3 membri de tipul int, unul private, unul protected și unul public. Creați un obiect din această clasă și setați valorile membrilor folosind API-ul pentru Reflection. Folosiți metoda ''getDeclaredFields'' din clasa ''Class'', și metodele ''setAccessible'' respectiv ''set'' din clasa ''Field''. | ||
- | - **(10p)** Acest task va urmări crearea unei clase ce poate rula teste având o funcționalitate de bază asemănătoare cu aceea a framework-ului Junit. Se vor folosi metodele ''getMethods'' și ''getAnnotations''. | + | - **(10p)** Acest task va urmări crearea unei clase ce poate rula teste având o funcționalitate de bază asemănătoare cu aceea a framework-ului Junit. Se vor folosi metodela ''Modifier.isPublic'' a clasei ''Modifier'', cât și metodele ''getGenericReturnType'', ''getGenericParameterTypes'', ''getAnnotations'' ale clasei ''Method''. Puteți folosi orice alte metode considerați din API. |
* **(2p)** Definirea adnotărilor ''@Test'', ''@Before'', ''@After''. | * **(2p)** Definirea adnotărilor ''@Test'', ''@Before'', ''@After''. | ||
* **(2p)** Identificarea metodelor cu adnotarea ''@Test''. Toate aceste metode trebuie să aibă tipul de retur ''boolean'' și să nu primească parametri. (Vor returna true dacă testul trece sau false daca pică). Programul trebuie să arunce excepție dacă există vreo metodă cu adnotarea ''@Test'' care nu respectă semnătura și trebuie să ia în considerare doar metodele publice. | * **(2p)** Identificarea metodelor cu adnotarea ''@Test''. Toate aceste metode trebuie să aibă tipul de retur ''boolean'' și să nu primească parametri. (Vor returna true dacă testul trece sau false daca pică). Programul trebuie să arunce excepție dacă există vreo metodă cu adnotarea ''@Test'' care nu respectă semnătura și trebuie să ia în considerare doar metodele publice. | ||
Line 207: | Line 224: | ||
failed : numărTesteEșuate | failed : numărTesteEșuate | ||
errors : numărTesteEronate | errors : numărTesteEronate | ||
+ | |||
+ |