Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici...

of 35 /35
Tehnici avansate de programare Curs - Cristian Fr ˘ asinaru [email protected] Facultatea de Informatic ˘ a Universitatea ”Al. I. Cuza” Ias ¸i

Embed Size (px)

Transcript of Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici...

Page 1: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Tehnici avansate de programareCurs -

Cristian Frasinaru

[email protected]

Facultatea de Informatica

Universitatea ”Al. I. Cuza” Iasi

Page 2: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Lucrul dinamic cu clase

Tehnici avansate de programare – p.1/36

Page 3: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Cuprins

Incarcarea claselor în memorie

Reflection API

Examinarea claselor si interfetelor

Lucrul dinamic cu obiecte

Lucrul dinamic cu vectori

Crearea proceselor *

Tehnici avansate de programare – p.2/36

Page 4: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Incarcarea claselor în memorie

Tehnici avansate de programare – p.3/36

Page 5: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Ciclul de viata al unei clase

1. Inc arcarea în memorie - va fi instantiat un obiect detip java.lang.Class .

2. Editarea de leg aturi - incorporarea noului tip dedate în JVM.

3. Initializarea - executia blocurilor statice deinitializare si initializarea variabilelor de clasa.

4. Descarcarea - Atunci când nu mai exista nici oreferinta de tipul clasei respective, obiectul de tipClass creat va fi marcat pentru a fi eliminat dinmemorie de catre garbage collector.

Tehnici avansate de programare – p.4/36

Page 6: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

ClasaClassLoader

1. Class loader-ul primordial (eng. bootstrap) -Reprezinta o parte integranta a masinii virtuale, fiindresponsabil cu încarcarea claselor standard dindistributia Java.

2. Class loader-e proprii - Acestea nu fac parteintrinseca din JVM si sunt instante ale claseijava.lang.ClassLoader . Aceasta este o clasa abstracta,tipul efectiv al obiectului fiind asadar derivat dinaceasta.

Tehnici avansate de programare – p.5/36

Page 7: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Class loader-e implicite

Boostrap Class Loader - Class loader-ul primordial.Acesta este responsabil cu încarcarea claselor dindistributia Java standard (cele din pachetele java.*,javax.*, etc.).

Extension Class Loader - încarcarea claselor dindirectoarele extensiilor JRE.

System Class Loader - încarcarea claselor propriiaplicatiilor Java (cele din CLASSPATH). Tipulacestuia este java.lang.URLClassLoader .

Fiecare obiect Class va retine class loader-ul care a fostfolosit pentru încarcare, acesta putând fi obtinut cumetoda getClassLoader .

Tehnici avansate de programare – p.6/36

Page 8: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Modelul "delegat"

Tehnici avansate de programare – p.7/36

Page 9: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Incarcarea unei clase în memorie

loadClass apelata pentru un obiect de tipClassLoader

ClassLoader loader = new MyClassLoader();loader.loadClass("NumeCompletClasa");

Class.forName

Class c = Class.forName("NumeCompletClasa");// echivalent cuClassLoader loader = this.getClass().getClassLoader();loader.loadClass("ClasaNecunoscuta");

// Clasele standard pot fi si ele incarcate astfelClass t = Class.forName("java.lang.Thread");

Tehnici avansate de programare – p.8/36

Page 10: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Instantierea unui obiect

Daca dorim sa instantiem un obiect dintr-o clasaîncarcata dinamic putem folosi metoda newInstance , cuconditia sa existe constructorul fara argumente pentruclasa respectiva.

Class c = Class.forName("java.awt.Button");Button b = (Button) c.newInstance();

Tehnici avansate de programare – p.9/36

Page 11: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

TestFunctii.java

public class TestFunctii {public static void main(String args[]) throws IOException {

int n=10, v[] = new int[n];Random rand = new Random();for(int i=0; i<n; i++) v[i] = rand.nextInt(100);// Citim numele unei functiiBufferedReader stdin = new BufferedReader(

new InputStreamReader(System.in));String numeFunctie = "";while (! numeFunctie.equals("gata")) {numeFunctie = stdin.readLine();try {Class c = Class.forName(numeFunctie);Functie f = (Functie) c.newInstance();f.setVector(v); // sau f.v = v;int ret = f.executa();System.out.println("\nCod returnat: " + ret);} catch (Exception e) { ... }

}}

}Tehnici avansate de programare – p.10/36

Page 12: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Functie.java

public abstract class Functie {public int v[] = null;public void setVector(int[] v) {

this.v = v;}public abstract int executa();

}

Tehnici avansate de programare – p.11/36

Page 13: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Diverse functii

Sort.javapublic class Sort extends Functie {public int executa() {if (v == null) return -1;Arrays.sort(v);for(int i=0; i<v.length; i++) System.out.print(v[i] + " ");return 0;

}}

Max.javapublic class Max extends Functie {public int executa() {if (v == null) return -1;int max = v[0];for(int i=1; i<v.length; i++)

if (max < v[i])max = v[i];

System.out.print(max);return 0;

}Tehnici avansate de programare – p.12/36

Page 14: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Folosirea class loader-ului curent

URLClassLoader

// Obtinem class loaderul curentURLClassLoader urlLoader =

(URLClassLoader) this.getClass().getClassLoader();

// Adaugam directorul sub forma unui URLurlLoader.addURL(new File("c:\\clase").toURL());

// Incarcam clasaurlLoader.loadClass("demo.Test");

Tehnici avansate de programare – p.13/36

Page 15: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Crearea unui class loader nou

public class MyClassLoader extends URLClassLoader{public MyClassLoader(URL[] urls){

super(urls);}

}// La initializareURLClassLoader systemLoader =

(URLClassLoader) this.getClass().getClassLoader();URL[] urls = systemLoader.getURLs();

// Cream class loaderul propriuMyClassLoader myLoader = new MyClassLoader(urls);myLoader.loadClass("Clasa");...// Dorim sa reincarcam clasamyLoader.loadClass("Clasa"); // nu functioneaza !// Cream alt class loaderMyClassLoader myLoader = new MyClassLoader(urls);myLoader.loadClass("Clasa"); // reincarca clasa

Tehnici avansate de programare – p.14/36

Page 16: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Mecanismul reflectarii

Tehnici avansate de programare – p.15/36

Page 17: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Ce înseamna reflection?

Mecanismul prin care o clasa, interfata sau obiect"reflecta" la momentul executiei structura lor interna senumeste reflectare.

Determinarea clasei unui obiect.

Aflarea unor informatii despre o clasa (modificatori, superclasa, constructori,metode).

Instantierea unor clase al caror nume este stiut abia la executie.

Setarea sau aflarea atributelor unui obiect, chiar daca numele acestora este stiutabia la executie.

Invocarea metodelor unui obiect al caror nume este stiut abia la executie.

Crearea unor vectori a caror dimensiune si tip nu este stiut decât la executie.

Tehnici avansate de programare – p.16/36

Page 18: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Reflection API

java.lang.Class

java.lang.Object

Clasele din pachetul java.lang.reflect si anume:Array

Constructor

Field

Method

Modifier

Tehnici avansate de programare – p.17/36

Page 19: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Examinarea claselor si interfetelor

Tehnici avansate de programare – p.18/36

Page 20: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Aflarea instantei Class

Class c = obiect.getClass();Class c = java.awt.Button.class;Class c = Class.forName("NumeClasa");

Class clasa = obiect.getClass();String nume = clasa.getName();

Interfetele sunt tot de tip Class, diferentierea lorfacându-se cu metoda isInterface.Tipurile primitive sunt descrise si ele de instante de tipClass având forma TipPrimitiv.class: int.class,double.class, etc., diferentierea lor facându-se cuajutorul metodei isPrimitive.

Tehnici avansate de programare – p.19/36

Page 21: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Aflarea modificatorilor unei clase

Metoda getModifiers

Class clasa = obiect.getClass();int m = clasa.getModifiers();String modif = "";if (Modifier.isPublic(m))

modif += "public ";if (Modifier.isAbstract(m))

modif += "abstract ";if (Modifier.isFinal(m))

modif += "final ";System.out.println(modif + "class" + c.getName());

Tehnici avansate de programare – p.20/36

Page 22: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Aflarea superclasei

Metoda getSuperclassReturneaza null pentru clasa Object

Class c = java.awt.Frame.class;Class s = c.getSuperclass();System.out.println(s); // java.awt.Window

Class c = java.awt.Object.class;Class s = c.getSuperclass(); // null

Tehnici avansate de programare – p.21/36

Page 23: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Aflarea interfetelor

Metoda getInterfacespublic void interfete(Class c) {

Class[] interf = c.getInterfaces();for (int i = 0; i < interf.length; i++) {

String nume = interf[i].getName();System.out.print(nume + " ");

}}...interfete(java.util.HashSet.class);// Va afisa interfetele implementate de HashSet:// Cloneable, Collection, Serializable, Set

interfete(java.util.Set);// Va afisa interfetele extinse de Set:// Collection

Tehnici avansate de programare – p.22/36

Page 24: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Aflarea membrilor

Variabile : getFields, getDeclaredFields→ Field

Constructori : getConstructors,getDeclaredConstructors→ Constructor

Metode : getMethods, getDeclaredMethods→ Method

Clase imbricate : getClasses,getDeclaredClasses

getDeclaringClass: clasa careia îi apartine unmembru.

Tehnici avansate de programare – p.23/36

Page 25: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Manipularea obiectelor

Tehnici avansate de programare – p.24/36

Page 26: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Crearea obiectelor

Metoda newInstance din clasa java.lang.ClassClass c = Class.forName("NumeClasa");Object o = c.newInstance();

Metoda newInstance din clasa ConstructorClass clasa = java.awt.Point.class;// Obtinem constructorul doritClass[] signatura = new Class[] {int.class, int.class};Constructor ctor = clasa.getConstructor(signatura);// Pregatim argumentele// Ele trebuie sa fie de tipul referinta corespunzatorInteger x = new Integer(10);Integer y = new Integer(20);Object[] arg = new Object[] {x, y};// InstantiemPoint p = (Point) ctor.newInstance(arg);

Tehnici avansate de programare – p.25/36

Page 27: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Invocarea metodelor

Metoda invoke din clasa MethodClass clasa = java.awt.Rectangle.class;Rectangle obiect = new Rectangle(0, 0, 100, 100);

// Obtinem metoda doritaClass[] signatura = new Class[] {Point.class};Method metoda = clasa.getMethod("contains", signatura);

// Pregatim argumentelePoint p = new Point(10, 20);Object[] arg = new Object[] {p};

// Apelam metodametoda.invoke(obiect, arg);

Tehnici avansate de programare – p.26/36

Page 28: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Setarea si aflarea variabilelor

Metodele set si get din clasa FieldClass clasa = java.awt.Point.class;Point obiect = new Point(0, 20);

// Obtinem variabilele membreField x, y;x = clasa.getField("x");y = clasa.getField("y");

// Setam valoarea lui xx.set(obiect, new Integer(10));

// Obtinem valoarea lui yInteger val = y.get(obiect);

Tehnici avansate de programare – p.27/36

Page 29: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

TestFunctii2.java

Class c = Class.forName(numeFunctie);Object f = c.newInstance();

Field vector = c.getField("v");vector.set(f, v);

Method m = c.getMethod("executa", null);Integer ret = (Integer) m.invoke(f, null);

System.out.println("\nCod returnat: " + ret);

Tehnici avansate de programare – p.28/36

Page 30: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Lucrul dinamic cu vectori

Vectorii sunt reprezentati ca tip de date tot prinintermediul clasei java.lang.Class, diferentiereafacându-se prin intermediul metodei isArray.Tipul de date al elementelor din care este format vectorulva fi obtinut cu ajutorul metodei getComponentType, ceîntoarce o referinta de tip Class.

Point []vector = new Point[10];Class c = vector.getClass();System.out.println(c.getComponentType());// Va afisa: class java.awt.Point

Tehnici avansate de programare – p.29/36

Page 31: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Obiecte de tip vector

Clasa Array

Crearea de noi vectori: newInstance

Aflarea numarului de elemente: getLength

Setarea / aflarea elementelor: set, get

Object a = Array.newInstance(int.class, 10);for (int i=0; i < Array.getLength(a); i++)

Array.set(a, i, new Integer(i));

for (int i=0; i < Array.getLength(a); i++)System.out.print(Array.get(a, i) + " ");

Tehnici avansate de programare – p.30/36

Page 32: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Crearea si comunicarea cu proceseexterne

Tehnici avansate de programare – p.31/36

Page 33: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Crearea unui proces

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

Runtime runtime = Runtime.getRuntime();Process child = runtime.exec("java Aplicatie");

runtime.exec("cmd.exe /c start help.html");

String[] commands = new String[]{"notepad", "calc"};runtime.exec(commands);

}}

Tehnici avansate de programare – p.32/36

Page 34: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Fluxul de iesire al unui proces

String command = "java Aplicatie";Process child = Runtime.getRuntime().exec(command);

// Citim de pe fluxul de iesire al procesuluiInputStream in = child.getInputStream();int c;while ((c = in.read()) != -1) {

// proceseaza c}in.close();

Tehnici avansate de programare – p.33/36

Page 35: Tehnici avansate de programare - profs.info.uaic.roacf/java/slides/ro/dinamic_slide.pdf · Tehnici avansate de programare Curs - Cristian Frasinaru˘ acf@infoiasi.ro Facultatea de

Fluxul de intrare al unui proces

String command = "java Aplicatie";Process child = Runtime.getRuntime().exec(command);

// Scriem pe fluxul de intrare al procesuluiOutputStream out = child.getOutputStream();

out.write("some text".getBytes());out.close();

Tehnici avansate de programare – p.34/36