Microsoft PowerPoint - 8_QA_Instrumente [Compatibility Mode]

Documente similare
Laborator 3

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Ingineria Sistemelor de Programare

Proiectarea Sistemelor Software Complexe

Paradigme de Programare

PROGRAMARE ORIENTATA PE OBIECTE

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 4. Dezvoltarea site-urilor si blog-uri

Declararea variabilelor

Top

Ingineria Sistemelor de Programare

CURS

2 BAZE TEORETICE ALE REȚELELOR DE CALCULATOARE CAPITOLUL 2 BAZE TEORETICE ALE REŢELELOR DE CALCULATOARE 2.1. Necesitatea standardizării (referenţierii

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

proiectarea bazelor de date

Programarea şi utilizarea calculatoarelor

Paradigme de programare

Introducere în limbajul JavaScript

PHP (II)

Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Test

Microsoft Word - lab4.doc

Web Social FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZE

Inserarea culorilor in tabele

EXCEL FĂRĂ SECRETE Grafice şi diagrame

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

A TANTÁRGY ADATLAPJA

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

Microsoft Word - Curs_07.doc

Resurse (Resources) Aspecte generale Utilizând unealta Resurse (Resources) puteți stoca pe serverul portalului Danubius Online diferite fișiere care c

9. Design patterns - Singleton, Factory, Observer Scopul acestui curs este familiarizarea cu folosirea unor pattern-uri des întâlnite în design-ul atâ

Modulul 1 M1-2.3 Protocoale şi servicii în reţea În acest capitol ne propunem să abordăm următoarele: Protocoalele şi aplicaţiile folosite în reţelele

Laborator02

Microsoft Word - CarteC.doc

Laborator - Configurarea Rutelor IPv4 Statice și Implicite Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gate

Manual de utilizare Room Booking System

Limbaje de Programare Curs 8 – Fisiere

e-learning Agronomie Platforma de e-learning Versiunea: Ghid de utilizare Beneficiar: UNIVERSITATEA DE STIINTE AGRONOMICE SI MEDICINA VETERINARA

PowerPoint Presentation

Addendum Syllabus 6 Microsoft Word 2016 REF Syllabus 6.0 Crearea unui document nou pe baza unor șabloane disponibile local sau online Microsoft

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre de

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Object Oriented Programming

Analiză de flux de date 29 octombrie 2012

CL2009R0976RO bi_cp 1..1

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

Microsoft Word - barcan.doc

Programarea şi utilizarea calculatoarelor

Microsoft Word - Curs_09.doc

tehnologii web

Ch

Microsoft Word - Curs 7 - JavaScript.doc

Lucrarea nr

Slide 1

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

Microsoft Word - 2 ES RO.doc

Analiză statică Analiza fluxului de date 23 octombrie 2014

Laborator - Configurarea de bază DHCPv4 pe un router Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gateway Ob

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 3. Achizitionarea domeniilor web si a

Curs 6 Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate reut

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 1. Google Drive, Google Calendar, WeTr

CABINET MINISTRU

Curs 10

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Slide 1

A.E.F. - suport laborator nr.5 sem.ii Analiza suprafețelor prin utilizarea elementelor 2D În acest laborator sunt atinse următoarele aspecte: realizar

Proceduri stocate Syntax: CREATE PROCEDURE <Name> type1,...] AS -- secventa de comenzi SQL GO O procedura stocata se ruleaza cu EXEC: EXEC <N

Microsoft® Access®

Ruby on Rails Pop Alexandru Pavel Razvan Calculatoare 4

Limbaje de Programare Curs 5 – Siruri de caractere

Lucrarea 10

Informație și comunicare

LABORATOR 1. Stocarea si partajarea fisierelor online cu ajutorul Dropbox, WeTransfer.com PREZENTAREA LUCRĂRII DE LABORATOR Lucrarea de laborator îşi

Laborator Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate r

Slide 1

1 Core JavaScript Programming Descrierea cursului Bazele programării JavaScript și programarea bazată pe limbajul C. Implementarea lui JavaScript în H

Slide 1

Microsoft Word - Excel_3.DOC

Facultatea de Științe Politice, Administrative și ale Comunicării Str. Traian Moșoiu nr. 71 Cluj-Napoca, RO Tel.: Fax:

Packet Tracer - Configurarea ACL-urilor extinse - Scenariul 1 Topologie Tabela de Adresare R1 Echipament Interfață Adresă IP Masca de subreţea Default

PowerPoint Presentation

Lucrarea nr. 9 - Liste dublu înlănţuite Breviar teoretic În cadrul elementelor studiate anterior s-a putut observa utilitatea listelor simplu înlănuit

A.E.F. - suport laborator nr.3 sem.ii Aplicațe privind utilizarea rețelelor 1D În acest laborator sunt atinse următoarele aspecte: realizarea schițelo

PPSD

PowerPoint Presentation

Addendum Syllabus 6 Microsoft Access 2016 REF Syllabus 6.0 Cunoașterea domeniilor în care se utilizează bazele de date Datorită potenţialului ma

Microsoft Word - PDS_proiect5_2019

Limbaje de programare. Laborator Clasa, obiect, abstractizare Clasa : descrie tipul obiectelor dintr-un program; poate fi asociată cu un şablon

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea

A.E.F. - suport laborator nr.8 sem.ii Analiza structurală la flambaj În acest laborator sunt atinse următoarele aspecte: modalitatea de analiză la fla

Microsoft Word - cap2.2.UNIX-NOS.doc

Slide 1

Transcriere:

Asigurarea Calităţii (QA) Instrumente Ciprian Dobre ciprian.dobre@cs.pub.ro 1

Sumar JavaDoc Formatarea Codului Eclipse Reflecţia API-ul Java Reflection MetaJ 2

JavaDoc The guy who knows about computers is the last person you want to have creating documentation for people p who don't understand computers. (Adam Osborne) 3 3

JavaDoc a Instrument ce generează documentaţie HTML pe baza codului sursă Java Standard industrial pentru documentarea API-ului Java Idea: dezvoltatorii adaugă comentarii speciale ce încep cu /** şi care conţin ţ informaţiile ţ de documentare înaintea claselor, câmpurilor şi metodelor Comentariile JavaDoc sunt structurate folosind tag-uri JavaDoc, care sunt cuvinte cheie ce încep cu un semn @ /** * Divides two integer numbers * @author Christof Lutteroth * @param x Dividend * @param y Divisor * @return x divided by y * @throws ArithmeticException if y==0 */ int div(int x, int y) { return x/y; } 4

Tag-uri JavaDoc @author name @version number @param name description @return description Specifică numele dezvoltatorului Adaugă un număr de versiune unei clase sau metode Adaugă o descriere unui parametru al unei metode Adaugă o descriere unei valori întoarsă de o metodă @throws classname description @see reference Adaugă o referinţă @since text @deprecated {@link package.class#member label} Descrie o excepţie posibilă pe care o metodă o poate arunca (sinonim cu @exception) Adaugă un comentariu de când o clasă/câmp/metodă există Marchează o metodă ca fiind depricată Adaugă o legătură la documentaţia unei alte clase/câmp/metodă 5

JavaDoc a şi Eclipse Eclipse dispune de posibilitatea de auto-inserare de comentarii JavaDoc 1. Mutaţi cursorul pe poziţia dinaintea tipului/metodei/câmpului 2. Tastaţi /** şi apăsaţi Enter Generarea automată a documentaţiei 1. Din meniu: Project -> Generate Javadoc 2. Se selectează locaţia executabilului javadoc.exe 3. Se selectează folderul unde va fi salvată documentaţia; de obicei /doc în folderul proiectului 4. Se pot selecta opţiuni legate de formatarea documentaţiei finale 5. Se face click pe finish 6

Vizualizarea a JavaDoc a în Eclipse 1. În view-ul JavaDoc atunci când sunt selectaţi identificatori prin double-click 2. În dialogul tip tooltip atunci când staţionăm cu cursorul mouse-ului peste identificator 3. În view-ul de ajutor în secţiunea "Java help, atunci când cursorul este poziţionat pe identificator 7

Instrumente de construcţie Ex Instrumentul t ANT Ants can carry more than 50 times their body weight. 8

Procesul de construcţie Generarea artefactelor pentru utilizatorii finali (programe executabile, documentaţie, fişiere împachetate) pornind de la artefactele dezvoltatorilor (codul sursă, modele, ) Poate presupune mai mulţi paşi complexi Obţinerea ultimei versiuni stabile a codului sursă dintr-un repository VCS (e.g. SVN) Compilarea fişierelor conţinând codul sursă, linkarea acestora (e.g. javac) Rularea de teste (e.g. JUnit) Generarea de documentaţie (e.g. JavaDoc) Împachetarea (e.g. jar) Instalarea/deploy (e.g. copierea pachetelor pe un server remote folosind ftp) Curăţenia (e.g. Ştergerea fişierelor vechi sau redundante) În general sunt folosite procese de construcţie diferite pentru versiuni diferite ale unui produs (e.g. vesiuni diferite de Linux enterprise, home şi small business) Procesele de construcţie pot fi automatizate folosind instrumente de construcţie 9

Instrumente te de construcţie Instrumentele de constucţie automatizează procesul de construcţie Procesul de construcţie este documentat/specificat într-un script de specificare a procesului de construcţie (eng. build script) Mai rapid decât construcţia manuală Ajută la efectuarea aceloraşi construcţii de fiecare dată (mai puţine greşeli) Pot fi folosite pentru gestiunea unor procese de construcţie dintre cele mai diverse Ajută la anularea defazajului dintre mediile de dezvoltare, integrare, testare şi producţie Orchestrarea procesului de construcţie; adesea sunt invocate alte instrumente pentru efectuarea paşilor ş de construcţieţ Pot fi declanşate de alte instrumente, e.g. Pentru nightly builds sau integrare continuă a produsului.class javac SVN.java files SVN jar.jar update files.html javadoc files Exemplu de proces de construcţie 10

Target agetş şi dependenţe Diverşii paşi implicaţi în procesul de construcţie sunt numiţi targets (rezultatul unui pas de construcţie este cunoscut sub denumirea de construirea unui target building a target ) Adesea există diverse dependenţe între target-uri, e.g. Obţinerea ultimei versiuni înaintea compilării codului sursă Compilarea codului sursă înaintea împachetării Target-urile trebuie să fie construite respectând aceste dependenţe Dependenţele target-urilor sunt tranzitive (dacă A B şi B C atunci A C) Procesul de construcţie poate fi optimizat prin executarea anumitor target-uri numai dacă acest lucru este absolut necesar (e.g. recompilarea claselor numai dacă fişierul.java s-a modificat) Exemplu: dependenţe între target-uri într-un proiect C++ calc x y = x depinde de y main.o math.o main.cpp math.cpp math.h 11

Instrumentul tu de construcţie ANT Instrument de scripting Independent de platformă, open-source pentru automatizarea proceselor de construcţieţ Foloseşte fişiere XML pentru descrierea proceselor de construcţie şi a dependenţelor între acestea (numele implicit al fişierului: build.xml) Implementat în Java, având ca target principal folosirea împreună cu proiecte Java; standard de facto Rezolvă probleme de portabilitate ale altor instrumente de construcţie (e.g. make) În cazul intrumentelor mai vechi acţiunile necesare pentru crearea unui target sunt specificate conform unor comenzi shell specifice platformei ANT furnizează funcţionalitate încorporată pentru construcţia multor taskuri comune proceselor de construcţie Funcţiile încorporate sunt garantate a se comporta (aproape) identic pe orice platformă de operare Un script ANT defineşte un proiect având target-uri Target: set de task-uri ce sunt executate Task: bucată de cod ce poate fi executată Când porniţi ANT puteţi selecta ce target(uri) sunt executate 12

Proiecte <project> reprezintă elementul de nivelul cel mai înalt; are trei atribute opţionale: name: numele proiectului default: target-ul default (când nu se alege nici un target de către utilizator) basedir: directorul de bază pentru căi relative Atributele unui <target>: name: numele target-ului (obligatoriu) depends: listă de target-uri de care poate depinde (opţional) description: descrie scurtă a target-ului (opţional) În exemplu: A este executat primul, apoi B, apoi C şi în final D <?xml version="1.0"?> <project name="dependencydemo"> <target name="a"/> <target name="b" depends="a"/> <target name="c" depends="a"/> <target name="d" depends="b B,C C"/> </project> B D A C 13

Task-uri Task: bucată de cod ce poate fi executată şi care poate avea o serie de atribute (argumente) şi sub-tags ANT încorporează peste 80 de task-uri predefinite; multe altele disponibileibil Adresarea unui task: <name attribute1="value1" attribute2="value2" /> <?xml version="1.0"?> <project name="hello" default="compile"> <target name="compile" description="compile.java files"> <mkdir dir="classes"/> <javac srcdir="." destdir="classes"/> </target> <!-- This is an XML comment --> <target name="jar" depends="compile" description="create a jar file for the application"> <jar destfile="hello.jar"> <fileset dir="classes" includes="**/*.class"/> <manifest> <attribute name="main-class" value="helloprogram"/> </manifest> </jar> </target> </project> 14

Mai multe task-uri Task-uri pentru fişiere: <copy file tofile>, <delete file>, <mkdir dir>,, <touch file>,, <get src dest> Task-uri Java: <java classname>, <javac srcdir destdir>, <javadoc sourcefiles destdir>, <junit > Împachetare: <jar destfile basedir>,, <zip destfile basedir>, <unzip src dest> Alte task-uri: <echo message>, <exec command>, <mail > Adăugarea propriilor p task-uri se face cu <taskdef name classname>: public class MyOwnTask extends Task { private String msg; // setter for attribute "message" public void setmessage(string msg) { this.msg = msg; } public void execute() throws BuildException { System.out.println(msg); } } 15

Proprietăţi Proprietate: nume case-sensitive asociat cu o valoare invariabil: odată setată nu mai poate fi modificată poate fi folosită în specificarea valorilor unor atribute t prin scrierea numelui proprietăţii între ${ şi } <property name="foo.x" value="bar"/> setează proprietatea foo.x la valoarea bar (pentru fişiere: locaţie în loc de valoare) Multe proprietăţi predefinite, e.g. basedir, ant.file, java.class.path, os.name, os.version, file.separator Target-urile pot fi executate condiţional cu atribute speciale: if: execuţia target-ului doar dacă o anumită proprietate este setată unless: execuţia target-ului doar dacă o proprietate nu este setată <?xml version="1 1.0"?> <project name="myproject"> <property name="classdir" location="classes"/> <target name="compile"> <javac srcdir="." destdir="${classdir}"/> </target> <target name="workaround-code" if="system-has-bug"/> <target name="normal-code" unless="system-has-bug"/> </project> 16

ANT şi Eclipse 1. Creaţi un fişier text build.xml în folderul principal al proiectului 2. Deschideţi view-ul Ant şi adăugaţi fişierul de construcţie prin drag&drop în interiorul view-ului 3. Double-click pe target pentru a-l executa 17 17

ANT Best Practices ces 1. Folosiţi Target-uri Simple Fiecare target ar trebui să execute o singură funcţionalitate bine definită Target-urile ce fac prea mult fac procesul de construcţie greu de întreţinut şi ar trebui împărţite în mai multe target-uri având dependenţe între ele 2. Standardizaţi Numele de Target-uri Sunt mai uşor de înţeles şi fac mai simplu procesul de folosire a mai multor fişiere de construcţie 3. Folosiţi Proprietăţi pentru Configurabilitate Proprietăţile ar trebui să fie definite pentru: Orice informaţie ce trebuie configurată Orice informaţie ce ar putea suferi modificări Orice informaţie folosită în mai mult de un loc 4. Definiţi proprietăţile la începutul fişierului de build sau într-un fişier de proprietăţi separat, de sine stătător 18

Formatarea Codului Sursă folosind Eclipse You may not be able to read a doctor's handwriting and prescription, but you'll notice his bills are neatly typewritten. (Earl Wilson ) 19

Formatarea Codului Sursă folosind Eclipse Majoritatea proiectelor folosite un standard de stil de codare (e.g. practica XP) Ajută la citirea codului, e.g. indentarea ar trebui să păstreze o anumită structură a codului Alegerea/definirea/customizarea profilului de stil de codare folosind Window -> Preferences -> Java -> Code Style -> Formatter Arată / schimbă profilul de stil de codare Aplicarea profilului de stil de codare editorului prin selectarea codului şi alegerea Source->Format 21.04.2010 20

Formatarea Codului Sursă folosind Eclipse Control deplin asupra Indentation Placement of braces Whitespace Blank lines New lines Control statements Line wrapping Comments 21

Sumar Instrumentele de documentare precum JavaDoc generează documentaţie API pornind de la adnotările aferente codului sursă Instrumentele de construcţie automatizează procesul de construcţie Gestiunea de configuraţii de construcţie diferite folosind scripturi de construcţie Task-uri sunt bucăţi de cod de definesc ce se construieşte Target-urile definesc seturi de task-uri ce sunt grupate logic împreună Target-urile pot depinde de alte target-uri Proprietăţile pot fi folosite pentru configurarea scriptului de construcţie Formatarea codului sursă poate fi folosit pentru impunerea unui stil de codare în mod automat 22

Reflecţia "Strange creatures on the other side of the mirror 23

Reflecţia ecţ Abilitatea unui program de a observa şi posibil modifica propria structură şi comportament. Două modalităţi de reflecţie Structurală: reflecţia asupra structurilor de date & codului. Comportamentală: reflecţia asupra comportamentului programului. Două operaţii de bază Introspecţia: observarea programului (eng. Introspection) Intervenţia: modificarea acestuia (eng. Intercession) Poate fi statică (înaintea de runtime) sau dinamică (în timpul runtime) Poate fi periculoasă 24

Protocoale de MetaObiecte ecte (MOPs) Modalitatea prin care este realizată reflecţia în limbajele Orientate- Obiect Entităţile interne programului (e.g. tipuri) sunt reprezentate ca metaobiecte, ce sunt instanţe ale unor metaclase Metaobiectele sunt similare obiectelor, dar servesc unui scop special Modalitatea de gestiune a acestor metaobiecte, spre exemplu modalitatea prin care metodele trebuie să fie apelate pentru a efectua un task de reflecţie, reprezintă protocolul de metaobiecte Introspecţia sistemului înseamnă obţinerea de metaobiecte Intervenţia înseamnă că putem modifica obiectele iar respectivele modificări vor afecta sistemul (uneori acest lucru este efectuat în mod automat) t) Program Internals Metaobjects 25

Introspecţia structurilor de date Structurile de date reprezintă de obicei un concept static Ele sunt definite înaintea compilării Rămân neschimbate în timpul rulării Uneori dorim ca un program să poată lucra chiar cu structuri t de date necunoscute S-ar putea să primească un obiect fără să cunoască exact clasa respectivului obiect Un sistem ar putea permite încarcarea dinamică de clase Soluţia: folosirea introspecţiei Obţinerea unui metaobiect al clasei în cazul obiectului necunoscut Metaobiectul oferă o descriere a clasei obiectului necunoscut Class String getname() Field[] getfields() Method[] getmethods() Constructor[] getconstructors() Object f = new Foo(); Class c = f.getclass(); System.out.println( c.getname()); 26

Introspecţia codului u Suportată doar în câteva limbaje Posibilitatea de a analiza corpurile metodelor şi vedea toate instrucţiunile Codul programului este de obicei reprezentat sub forma arborilor abstracţi de sintaxă (AST) Metaclase pentru diverse instrucţiuni, ţ expresii, class Foo { int inc(int x) { return x + 1; } } Variable Metaobiecte t name = x IntConstant value = 1 Plus expr1 expr2 Object f = new Foo(); Method m = f.getclass().getmethod( getmethod("inc"); Statement[] stmts = m.getbody(); Return expr Statement[] element 0 27

Intervenţia Structurile de date / codul programului pot fi modificate la runtime Se poate, de exemplu, prin simpla modificare a meta-obiectelor Mecanism rar - poate induce un grad de pericol (confuzie şi nesiguranţă) Invarianţi precum tipuri i şi i codul programului sunt importanţi pentru înţelegerea unor sisteme complexe Pseudo-cod Object f = new Foo(); Method m = f.getclass().getmethod("inc"); Statement[] stmts = m.getbody(); Return rstmt = (Return) stmts[0]; Plus pexpr = (Plus) rstmt.expr; pexpr.expr2 = new IntConstant(99); Înainte class Foo { int inc(int x) { return x+1; } } După class Foo { int inc(int x) { return x+99; } } 28

Java Reflection API 29 29

Reflecţia ecţ în Java a Java nu suportă în întregime conceptul de reflecţie dinamicăi ă Doar anumit grad de reflecţie Introspecţia tipurilor Introspecţia semnăturilor de metode Introspecţia accesului la tipuri şi metode Instanţiere Accesul la câmpuri Invocarea metodelor Pentru siguranţă: ţ când ceva nu funcţionează ţ sunt aruncate excepţii (e.g. NoSuchFieldException, NoSuchMethodException, SecurityException) 30

Când aveți nevoie de reflecție? În programele normale l cel mai adesea nu veți avea nevoie de reflecție Totuși Aveți nevoie de reflecție dacă dezvoltați programe ce procesează alte programe (module, componente, plug-ins, servicii, etc). Exemple tipice: Un container Web (Tomcat, JBoss) Un program ce încarcă plug-in-uri (Eclipse) Un program pentru testarea automată a temelor 31

Clasa Class Pentru a obține metaobiectul ce descriu o clasă puteți: Dacă dețineți instanța/obiectul obj, puteți obține obiectul Class din Class c = obj.getclass(); Puteți obține obiectul Class ce descrie o superclasă a clasei c prin Class sup = c.getsuperclass(); Dacă cunoașteți numele clasei (ex, Button) la compilare, puteți obține obiectul Class prin Class c = Button.class; Dacă cunoașteți numele clasei la run-time puteți obține obiectul Class prin Class c = class.forname(str); 32

Nu întotdeauna: Funcționează? Doar dacă ClassLoader-ul cunoaște clasa respectivă Altfel se aruncă ClassNotFoundException Soluția pentru încărcarea ă dinamică i ă a claselor constă în folosirea propriului ClassLoader 33

Exemplu de încărcare a unei clase: import java.io.file; import java.net.url; import java.net.urlclassloader;. L class MyClass{ public String mymethod() { return "a message"; } } public class Main { public static void main(string[] argv) throws Exception { URL[] urls = null; File dir = new File(System.getProperty("user.dir") + File.separator + "dir" + File.separator); URL url = dir.touri().tourl(); urls = new URL[] { url }; ClassLoader cl = new URLClassLoader(urls); Class cls = cl.loadclass("myclass"); MyClass myobj = (MyClass) cls.newinstance(); } Versus: obj.getclass().getclassloader(). loadclass( MyClass ); 34

import java.lang.reflect.method; import java.net.url; import java.net.urlclassloader; URL class loader public class MainClass { static public void main(string args[]) throws Exception { URL myurl[] = { new URL("file:///C:/IDP/ClassLoader/web/"), new URL("http://www http://www.java2s.edu/~xyx/test/ edu/~xyx/test/") }; URLClassLoader x = new URLClassLoader(myurl); Class c = x.loadclass("testurl"); Class getarg1[] = { (new String[1]).getClass() }; Method m = c.getmethod("main", th " getarg1); String[] my1 = { "arg1 passed", "arg2 passed" }; Object myarg1[] = { my1 }; m.invoke(null, myarg1); Object ob = c.newinstance(); Class arg2[] = {}; Method m2 = c.getmethod("tt", arg2); m2.invoke(ob, null); Class arg3[] = { (new String()).getClass(), int.class }; Method m3 = c.getmethod("tt", arg3); Object myarg2[] = { "Arg1", new Integer(100) }; m3.invoke(ob, myarg2); } } 35

Sau chiar un JarClassLoader class JarClassLoader extends URLClassLoader { private URL url; public JarClassLoader(URL url) { super(new URL[] { url }); this.url = url; } public String getmainclassname() throws IOException { URL u = new URL("jar", "", url + "!/"); JarURLConnection uc = (JarURLConnection) u.openconnection(); Attributes attr = uc.getmainattributes(); return attr!= null? attr.getvalue(attributes.name.main_class) : null; } public void invokeclass(string name, String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException { Class c=loadclass(name); Method m = c.getmethod("main", new Class[] { args.getclass() }); m.setaccessible(true); int mods = m.getmodifiers(); if (m.getreturntype()!= void.class!modifier.isstatic(mods)!modifier.ispublic(mods)) { throw new NoSuchMethodException("main"); } try { m.invoke(null, new Object[] { args }); } catch (IllegalAccessException e) { } } } 36

Obținerea numelui clasei încărcată Dacă aveți un obiect clasă c, puteți obține numele clasei din care a fost acesta încărcat folosind c.getname() getname întoarce numele întreg, de ex: Class c = Button.class; String s = c.getname(); e(); System.out.println(s); va aafișa java.awt.button 37

Obținerea superclaselor getsuperclass() întoarce un obiect Class (sau null dacă este apelat asupra unui Object ce nu extinde nici o superclasă) Exemplu: static void printsuperclasses(object o) { Class subclass = o.getclass(); Class superclass = subclass.getsuperclass(); while (superclass!= null) { String classname = superclass.getname(); System.out.println(className); subclass = superclass; superclass = subclass.getsuperclass(); } 38

Obținerea modificatorilor Modificatorii (public, final, abstract etc.) unui obiect Class sunt codificați în interiorul unui int și pot fi interogați prin metoda getmodifiers(). Pentru decodificarea rezultatului int se folosesc metodele ale clasei Modifier: import java.lang.reflect.*; lect. Exemplu: if (Modifier.isPublic(m)) ispublic(m)) System.out.println("public"); 39

Obținerea modificatorilor Modifier conține ț metode precum: public static boolean isabstract(int) public static boolean isfinal(int) public static boolean isinterface(int) public static boolean isprivate(int) public static boolean isprotected(int) public static boolean ispublic(int) public static String tostring(int) Această metodă întoarce un string de forma "public final synchronized strictfp" 40

Obținerea interfețelor O clasă poate implementa zero sau mai multe interfețe ț getinterfaces() întoarce un array de obiecte Class. Exemplu: static void printinterfacenames(object o) { } Class c = o.getclass(); Class[] theinterfaces = c.getinterfaces(); for (Class inf: interfaces) { System.out.println(inf.getName()); ()) } 41

Obținerea câmpurilor public Field[] getfields() throws SecurityException Întoarce un array de obiecte public Fields (inclusiv câmpurile moștenite). Lungimea acestui array poate fi zero Câmpurile nu sunt întoarse într-o anumită ordine Nu sunt întoarse variabile statice. public Field getfield(string i name) throws NoSuchFieldException, SecurityException Întoarce un anumit public Field 42

Obținerea Constructorilor unei clase Dacă c este un obiect Class, atunci c.getconstructors() : Constructor[] întoarce un array al constructorilor publici ai clasei c. c.getconstructor( Class paramtypes ) întoarce un contructor corespunzător tipurilor de parametrii ce se potrivesc argumentelor. Ex: String.class.getConstructors().length getconstructors() length > 15; String.class.getConstrucor( getconstrucor( char[].class, class int.class, int.class).tostring() > String(char[], int,int). int) 43

Constructori Dacă c este un obiect Constructor, atunci c.getname() întoarce numele constructorului c.getdeclaringclass() întoarce obiectul Class în care a fost declarat c.getmodifiers() întoarce modificatorii Modifiers ai constructorului c.getparametertypes() t T întoarce un array de obiecte Class în ordinea declarării acestora c.newinstance(object initargs) crează și întoarce o nouă instanță a clasei c 44

Exemplu Constructor c = String.class.getConstrucor( char[].class, int.class, int.class).tostring() String(char[], int,int). String s = c.newinstance( new char[] { a {a, b, c, d }, 1, 2 ); assert s.equals( bc ); 45

Metode public Method[] getmethods() throws SecurityException ti Întoarce un array de obiecte Method Acestea sunt metodele publice ale clasei sau interfeței, incluziv metodele moștenite public Method getmethod(string name, Class parametertypes) throws NoSuchMethodException, SecurityException 46

Exemple de invocare dinamică a abcdefg.length() unei metode > 7 Method lengthmethod = String.class.getMethod( length ) ; lengthmethod.invoke( abcdefg ) g > 7 abcdefg.substring(2, g( 5) > cde Method substringmethod = String.class.getMethod ( substring, int.class, Integer.TYPE ) ; substringemthod.invoke( abcdefg, 2, new Integer(5) ) > cde 47

Array Pentru a determina dacă un obiect obj este un array, Porniți de la clasa c: Class c = obj.getclass(); Executați testul c.isarray() Pentru a afla tipul componentelor unui array, c.getcomponenttype() Întoarce null dacă c nu este clasa unui array Exemplu: int[].class.isarray() == true ; int[].class.getcomponenttype() == int.class 48

Array Clasa Array furniează metode statice pentru invocarea array-urilor De exemplu, pentru crearea unui array Array.newInstance(Class componenttype, int size) Această metodă întoarce, ca Object, noul array Obiectul componenttype poate fi un alt array Aceasta ar putea conduce la crearea unui array multidimensional Array.newInstance(Class componenttype, int sizes) Această metodă întoarce, ca Object, noul array multi- dimensional (cu sizes.length dimensiuni) 49

Exemple Următoarele două obiecte sunt de același ș tip: new String[10] Array.newInstance(String.class, 10) Următoarele două obiecte sunt de asemenea de același tip: new String[10][20] Array.newInstance(String.class, 10, 20) 50

Array Pentru a obține valoarea elementelor unui array, Array.get(Object array, int index) întoarce un Object Array.getBoolean(Object array, int index) întoarce un boolean Array.getByte(Object array, int index) întoarce un bt byte etc. Pentru stocarea unei valori într-un array, Array.set(Object array, int index, Object value) Array.setInt(Object array, int index, int i) Array.setFloat(Object array, int index, float f) etc. 51

Exemple a = new int[] {1,2,3,4};,, Array.getInt(a, 2) // 3 Array.setInt(a, t( 3, 5 ) // a = {1,2,3, 5 }. s = new String[] { ab, bc, cd }; Array.get(s, 1 ) // bc Array.set(s, 1, xyz ) // s[1] = xyz 52

Obținerea ț membrilor non-publici ai unei clase Toate metodele getxyz () ale clasei Class menționate întorc doar membrii public ai clasei respective. Există un alt set de metode, getdeclaredxyz(), în clasa Class ce întoarce toți (chiar private sau static ) membrii clasei, dar fără membrii moșteniți. getdeclaredconstructors(), defdeclaredconstrucor(class ) getdeclaredfields(), getdeclaredfield(string) getdeclaredmethods(), getdeclaredmethod(string, Class ) 53

Exemple String.class.getConstructors().length > 15 String.class.getDeclaredConstructors().length getdeclaredconstructors() length > 16. Constructor[] t cs = String.class.getDeclaredConstructors(); for(constructor c : cs) if(! (Modifier.isPublic(c.getModifiers()))) ( ()))) out.println(c); > java.lang.string(int,int,char[]) int // package 54

Exemplu de reflecţie ecţ e în Java: a Introspecţia import java.lang.reflect.*; public class Test { public static void main(string[] args) { Object o = new Integer(1); Class c = o.getclass(); System.out.println(c.getName()); // java.lang.integer System.out.println( c.getsuperclass().getname()); // java.lang.number System.out.println( c.getpackage().getname()); // java.lang for(field f : c.getfields()) System.out.println(f); // int MIN_VALUE, for(method m : c.getmethods()) System.out.println(m); // int hashcode(), for(constructor ct : c.getconstructors()) System.out.println(ct); // Integer(int), } } 55

Exemplu de reflecţie în Java: Acces bazat pe introspecţie (1) public class Foo { public void hello() { System.out.println("hello!"); } } import java.lang.reflect.*; public class Test { public static void main(string[] args) { try { Class c = Class.forName("Foo"); Method m = c.getmethod("hello", null); m.invoke(c.newinstance(), null); } catch(exception e) { e.printstacktrace(); } } } 56

Exemplu de reflecţie în Java: Acces bazat pe introspecţie (2) public class Foo { public int x; } import java.lang.reflect.*; public class Test { public static void main(string[] args) { try { Class c = Class.forName( forname("foo"); Field fieldx = c.getfield("x"); Object foo = c.newinstance(); fieldx.set(foo, 99); System.out.println(fieldx.get(foo)); } catch(exception e) { e.printstacktrace(); } } } 57

Clasa Class<T> static Class<?> forname(string classname) String getname() String getsimplename() Class<? super T> getsuperclass() Field[] getdeclaredfields() Field[] getfields() Field getdeclaredfield(string name) Field getfield(string name) Constructor<T> getconstructor(class... paramtypes) Method getmethod(string name, Class... paramtypes) T newinstance() boolean isarray() boolean isinterface() boolean isprimitive() 58

Clasa Field şi Clasa Method Class Field String getname() Class<?> gettype() Object get(object obj) int getint(object obj) boolean getboolean(object obj) void set(object obj, Object value) Class Method String getname() Class<?>[] getparametertypes() Class<?> getreturntype() Object invoke(object obj, Object... args) 59

Quiz 1. Care sunt cele două operaţii ţ de bază ale reflecţiei? Ce fac acestea? 2. Ce capabilităţi de reflecţie există în Java? 3. De ce reflecţia poate fi periculoasă? 60

Accesarea câmpurilor private public class Secret { } private String secretcode = "It's a secret"; private String getsecretcode(){ return secretcode; } import java.lang.reflect.field; import java.lang.reflect.method; public class Hacker { private static final Object[] EMPTY = {}; public void reflect() throws Exception { Secret instance = new Secret(); Class secretclass = instance.getclass(); // Print all the method names & execution result Method methods[] = secretclass.getdeclaredmethods(); System.out.println("Access all the methods"); for (int i =0;i < methods.length; i++) { System.out.println("Method Name: " + methods[i].getname()); System.out.println("Return type: " + methods[i].getreturntype()); methods[i].setaccessible(true); System.out.println(methods[i].invoke(instance, invoke(instance EMPTY) + "\n"); } 61

Accesarea câmpurilor private public class Secret { private String secretcode = "It's a secret"; private String getsecretcode(){ return secretcode; } } // Print all the field names & values Field fields[] = secretclass.getdeclaredfields(); System.out.println("Access all the fields"); for (int i = 0; i < fields.length; i++){ System.out.println( println("field Name: " + fields[i].getname()); fields[i].setaccessible(true); System.out.println(fields[i].get(instance) + "\n"); } } public static void main(string[] args){ Hacker newhacker = new Hacker(); try { newhacker.reflect(); } catch (Exception e) { e.printstacktrace(); } } 62

MetaJ http://www.emn.fr/z-info/sudholt/research/metaj/ 63

MetaJ Interpretor reflectiv pentru limbaje tip Java Prototip de cercetare scris de Rémi Douence şi Mario Südholt http://www.emn.fr/x-info/sudholt/research/metaj/ Oferă reflecţie completă dinamică structurală & comportamentală: se pot modifica clase, cod şi chiar şi interpretorul Cu alte cuvinte: aproape orice poate fi modificat de către un program Totuşi: dacă modificaţi lucrul incorect puteţi uşor ajunge la crash Problema comună limbajelor reflective: balansarea între putere şi siguranţă 64

Exempl mplu: Reflecţie ecţ e Dinamică cu MetaJ class Pair { String fst; String snd; } class PrintablePair extends Pair { String tostring() { return "(" + fst + ", " + snd + ")"; } } Metaobiect ce descrie class Main { clasa void main() { Pair p = new Pair("1", "2"); Class metaclass = reify(pair); // Introspection if (metaclass.getextendslink() == null) System.out.println("Pair has no superclass!!!"); Instance metapair a = reify(p); // Intercession metapair.instancelink = PrintablePair; System.out.println(p.toString()); } } Metaobiect ce descrie instanța 65

Metaclasele ase e din MetaJ class Class { Class extendslink; // superclasa DataList datalist; // lista de câmpuri MethodList methodlist; Instance instantiate() {... } // operatorul new } class Method { private StringList args; // numele parametrilor private Exp body; // corpul metodei } Data apply(environment argse, Instance i) {... return this.body.eval(argse); In plus față de Java } 66

Probleme e de siguranţă class Pair { String fst; String snd; String tostring() { return "(" + fst + ", " + snd + ")"; } } class NotAPair { int fst; } class Main { void main() { Pair p = new Pair("1", "2"); Instance metapair = reify(p); metapair.instancelink = NotAPair; p.fst = 99; System.out.println(p.toString()); } } 67

Reflecţie ecţ eco Comportamentală pota taă Nu doar programul ce rulează poate fi modificat (reflecţie structurală), dar şi sistemul de rulare (reflecţie ţ comportamentală) În MetaJ: chiar interpretorul poate fi modificat Meta-arhitectură tip "Reflective Towers" Interpretorul de bază ce interpretează programul nu se modifică Posibilitatea inserării unui nou interpretor intermediar între interpretorul de bază şi program Interpretorul intermediar poate fi modificat arbitrar folosind Program reflecţia (precum programul) Posibilitatea modificării semanticii Intermediate Interpreter operaţionale o a e a limbajului u Interpretorul de bază interpretează interpretorul intermediar de deasupra care la rândul să interpretează Intermediate Interpreter programul Putem insera oricâte interpretoare Base Interpreter intermediare (turn de interpretoare) 68

Sumar Reflecţia reprezintă abilitatea unui program de a observa şi posibil modifica propria structură şi comportament Introspecţia şi intervenţia Limbajele OO folosesc protocoale de metaobiecte (MOPs) cu metaclase şi metaobiecte Java suportă doar anumite facilităţi ţ de acces introspectiv la metode şi câmpuri Alte limbaje (e.g. MetaJ) oferă reflecţie totală Totuşi: reflecţia poate fi periculoasă 69