• Aucun résultat trouvé

cm08-introspection.pdf — June 1, 2005 — 1

N/A
N/A
Protected

Academic year: 2021

Partager "cm08-introspection.pdf — June 1, 2005 — 1"

Copied!
7
0
0

Texte intégral

(1)

as

Architecture des Systèmes d’Information

Introduction Description dereflect JDBC

Programmation - Introspection -

Nicolas Malandain

June 1, 2005

Introspection 1 / 25

as

Architecture des Systèmes d’Information

Introduction Description dereflect JDBC

1

Introduction Pr´ esentation Utilisation

2

Description de reflect Class

Constructor Field Method Exemple

3

JDBC

Pr´ esentation

Fonctionnement de base Exemple

Introspection 2 / 25

Introduction Description dereflect JDBC Pr´esentation Utilisation

Introspection

Pr´ esentation

Une classe est un objet, elle poss` ede donc un ´ etat et des m´ ethodes. Son

´

etat correspond ` a des attributs (meta-donn´ ees) tels que : nom de la classe, ses attributs, ses m´ ethodes, . . . Ses m´ ethodes permettent la manipulation de l’´ etat, r´ ecup´ eration des attributs, des m´ ethodes et des constructeurs, . . . Les attributs, constructeurs et m´ ethodes sont eux mˆ eme des objets.

O` u sont ces m´ eta-donn´ ees ?

Le byte-code issue de la compilation contient les m´ eta-donn´ ees d´ ecrivant la classe. La commande javap permet d’acc´ eder ` a ces informations.

Comment les manipuler ?

Java dispose d’un package java.lang.reflect permettant de manipuler des classes telles que : Class, Field, Constructor, Method, ...

Introspection 3 / 25

Introduction Description dereflect JDBC Pr´esentation Utilisation

Ex´ ecution de “javap java.lang.Integer”

public final class java.lang.Integer extendsjava.lang.Number implementsjava.lang.Comparable{

public static final intMIN_VALUE;

public static final intMAX_VALUE;

public static final java.lang.Class TYPE;

static final char[] digits;

public longlongValue();

public float floatValue();

public doubledoubleValue();

public java.lang.String toString();

public int hashCode();

public booleanequals(java.lang.Object);

public static java.lang.Integer getInteger(java.lang.String);

public int compareTo(java.lang.Object);

static {};

}

C’est ` a l’aide de ces m´ eta-donn´ ees que Java est capable de donner des informations lors d’une erreur ` a l’ex´ ecution d’un programme (classe ou m´ ethode non trouv´ ee, num´ ero de ligne, . . . ).

Introspection 4 / 25

(2)

Introduction Description dereflect JDBC Pr´esentation Utilisation

Utilit´ e de l’introspection

Quelques exemples :

Instancier/Manipuler un objet dont on ne connait pas la classe ` a la compilation (notamment utilis´ e pour les drivers)

Un inspecteur de classe (notamment utilis´ e dans Netbeans ou Eclipse)

Un interpr´ eteur de commandes . . .

Introspection 5 / 25

Introduction Description dereflect JDBC Pr´esentation Utilisation

Exemple de cr´ eation/manipulation

ManipulerSansIntrospection.java

public static voidmain(String[] args) {

// A, B et C impl´ementent une interface Manipulation poss´edant une m´ethode methode() // ´etendre ce programme `a fin de le g´en´eraliser tel quel est impossible

String nomDeLaClasse = args[0];

Manipulation objManipulation =null;

if (nomDeLaClasse.equals("A")) objManipulation = newA();

else

if (nomDeLaClasse.equals("B")) objManipulation = newB();

else

if (nomDeLaClasse.equals("C")) objManipulation =new C();

if (objManipulation !=null)

System.out.println(objManipulation.methode());

}

Introspection 6 / 25

Introduction Description dereflect JDBC Pr´esentation Utilisation

Utilisation de l’introspection pour g´ en´ eraliser

obtention d’une instance de la classe Class permettant de manipuler la classe que l’on souhaite cr´ eer (A, B, C, . . . ) instanciation de la classe

appel de la m´ ethode methode()

ManipulerAvecIntrospection.java

public static voidmain(String[] args) { String nomDeLaClasse = args[0];

Manipulation objManipulation =null;

try {

Class classe = Class.forName(nomDeLaClasse);

objManipulation = (Manipulation)classe.newInstance();

System.out.println(objManipulation.methode());

}

catch(ClassNotFoundException e) { ...

}

catch(InstantiationException e) { ...

}

catch(IllegalAccessException e) { ...

Introduction Description dereflect JDBC Pr´esentation Utilisation

Ex´ ecution

java fr.insarouen.asi.prog.cours8.ManipulerAvecIntrospection \ fr.insarouen.asi.prog.cours8.C

Traitement dans la classe C

java fr.insarouen.asi.prog.cours8.ManipulerAvecIntrospection ExistePas La classe que vous passez en param`etre n’existe pas

java.lang.ClassNotFoundException: ExistePas

(3)

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

La classe Class

API de la classe Class (non exhaustif)

public final classClass<T>extendsObject

implementsSerializable, GenericDeclaration, Type, AnnotatedElement { static Class<?> forName(String className)

Constructor[] getConstructors() Constructor[] getDeclaredConstructors() Field getDeclaredField(String name) Field[] getDeclaredFields()

Method getDeclaredMethod(String name, Class... parameterTypes) Method[] getDeclaredMethods()

Field getField(String name) Field[] getFields() Class[] getInterfaces()

Method getMethod(String name, Class... parameterTypes) Method[] getMethods()

int getModifiers()

String getName()

Package getPackage() Class<?superT> getSuperclass()

boolean isArray()

boolean isEnum()

boolean isInstance(Object obj) boolean isInterface() boolean isLocalClass() boolean isMemberClass() boolean isPrimitive()

T newInstance()

String toString()

} Introspection 9 / 25

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

Manipulation de Class

TestIntrospection.java

String s="toto";

Class a = s.getClass();

Class b = a.getSuperclass();

Class c = java.lang.String.class;

Class d = Class.forName("java.lang.String");

System.out.println(a);

System.out.println(b);

System.out.println(c);

System.out.println(d);

int modifiers=c.getModifiers();

if (Modifier.isPublic(modifiers)) System.out.println("public");

for(Class interf : c.getInterfaces()) System.out.println(interf);

Ex´ ecution

class java.lang.String class java.lang.Object class java.lang.String class java.lang.String

public

interface java.io.Serializable interface java.lang.Comparable interface java.lang.CharSequence

Introspection 10 / 25

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

La classe Constructor

API de la classe Constructor (non exhaustif)

public final class Constructor<T> extendsAccessibleObject

implementsGenericDeclaration, Member { Class<?>[] getExceptionTypes()

int getModifiers() String getName()

Class<?>[] getParameterTypes()

TypeVariable<Constructor<T>>[] getTypeParameters() boolean isVarArgs()

T newInstance(Object... initargs) String toGenericString()

String toString() }

Instanciation

Deux possibilit´ es, appel de newInstance : de Class pour le constructeur par d´ efaut de Constructor d’une mani` ere g´ en´ erale

Introspection 11 / 25

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

Manipulation de Constructor

TestIntrospection.java

Class classA = Class.forName("fr.insarouen.asi.prog.cours8.A");

Constructor[] constructors = classA.getDeclaredConstructors();

for(Constructor constructor : constructors) { System.out.println(constructor);

}

Class[] parametresFormels = {int.class,int.class, String.class};

Constructor constructor = classA.getConstructor(parametresFormels);

Object[] parametres = {1, 8, "coucou"};

Object objetA = constructor.newInstance(parametres);

System.out.println(objetA);

Ex´ ecution

publicfr.insarouen.asi.prog.cours8.A()

publicfr.insarouen.asi.prog.cours8.A(int,int,java.lang.String)

publicfr.insarouen.asi.prog.cours8.A(java.lang.Integer,java.lang.String) 1 / 8 / coucou / 42

Introspection 12 / 25

(4)

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

La classe Field

API de la classe Field (non exhaustif)

public final class Field extendsAccessibleObject implementsMember { Object get(Object obj)

boolean getBoolean(Object obj) char getChar(Object obj) double getDouble(Object obj) int getInt(Object obj) int getModifiers() String getName() Class<?> getType()

void set(Object obj, Object value) void setBoolean(Object obj,booleanz) void setByte(Object obj,byteb) void setChar(Object obj,char c) void setDouble(Object obj,doubled) void setFloat(Object obj,floatf) void setInt(Object obj,inti) void setLong(Object obj,long l) void setShort(Object obj,shorts) String toGenericString()

String toString() }

Introspection 13 / 25

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

Manipulation de Field

TestIntrospection.java

classA.getField("entier").set(objetA,10);

Field[] attributs = classA.getFields();

for(Field field : attributs) { Class fieldType = field.getType();

System.out.println(fieldType.getName()+" : "+field.getName()+" = "+field.get(objetA));

}

Ex´ ecution

int : entier = 10

java.lang.String : chaine = coucou int : reponse = 42

Introspection 14 / 25

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

La classe Method

API de la classe Method (non exhaustif)

public final class MethodextendsAccessibleObject implementsGenericDeclaration, Member { Class<?> getDeclaringClass()

Class<?>[] getExceptionTypes() int getModifiers() String getName()

Class<?>[] getParameterTypes() Class<?> getReturnType()

TypeVariable<Method>[] getTypeParameters() Object invoke(Object obj, Object... args) String toGenericString()

String toString() }

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

Manipulation de Method

TestIntrospection.java

Method[] methods = classA.getMethods();

for(Method method : methods) System.out.println(method);

Method method = classA.getMethod("methode",int.class, String.class);

Object[] parametres2 = {666, "toto"};

method.invoke(objetA, parametres2);

System.out.println(objetA);

Ex´ ecution

public java.lang.String fr.insarouen.asi.prog.cours8.A.methode() public void fr.insarouen.asi.prog.cours8.A.methode(int,java.lang.String) public java.lang.String fr.insarouen.asi.prog.cours8.A.toString() public native int java.lang.Object.hashCode()

public final native java.lang.Class java.lang.Object.getClass()

public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final void java.lang.Object.wait() throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object)

public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll() 1 / 666 / toto / 42

(5)

Introduction Description dereflect JDBC Class Constructor Field Method Exemple

Test de performance d’un tri en fonction de la structure

TestCollections.java

public class TestCollections {

public static voidmain(String[] args) { try {

Class classe = Class.forName(args[0]);

List l = (List)classe.newInstance();

for(int i=0; i<1000000; i++)

l.add(Math.round(Math.random()*1E10));

Collections.sort(l);

}catch(ClassNotFoundException e) { System.err.println("Classe inexistante");

System.err.println(e);

} ...

} }

Ex´ ecution

time java fr.insarouen.asi.prog.cours8.TestCollections java.util.LinkedList real 0m3.463s

user 0m3.309s sys 0m0.092s

Introspection 17 / 25

Introduction Description dereflect JDBC Pr´esentation Fonctionnement de base Exemple

Introduction ` a JDBC

Java DataBase Connectivity

biblioth` eque d’interfaces et de classes communication avec un SGBDR manipulation de requˆ etes SQL

Drivers

Il existe diff´ erents drivers JDBC pour diff´ erentes bases de donn´ ees

Introspection 18 / 25

Introduction Description dereflect JDBC Pr´esentation Fonctionnement de base Exemple

Cr´ eation de la connexion

Chargement du driver

Class.forName(‘‘classedudriver’’);

Ouverture de la connexion

Connection connection;

connection=DriverManager.getConnection("UrlDeLaBaseDeDonn´ees","login","passwd");

Introspection 19 / 25

Introduction Description dereflect JDBC Pr´esentation Fonctionnement de base Exemple

Requˆ etes

Cr´ eation d’un objet Statement

Statement statement = connection.createStatement();

cet objet permet l’ex´ ecution de requˆ etes SQL un seul objet ResultSet lui est associ´ e

Ex´ ecution de requˆ etes sur l’objet Statement

int executeUpdate("requete modification (insert/update/delete)");

ResultSet executeQuery("requete de consultation (select)");

Utilisation de ResultSet

boolean next() , boolean previous() // positionnement sur les tuples leType getLeType(String nomColonne) // r´ ecup´ eration des valeurs

Introspection 20 / 25

(6)

Introduction Description dereflect JDBC Pr´esentation Fonctionnement de base Exemple

Gestion de transaction en Java

Transaction

Ensemble d’instructions effectu´ ees ensembles pour assurer la coh´ erence des donn´ ees de la base

M´ ethode

connection.setAutoCommit(false);

try {

// instructions SQL de latransaction // validation de latransaction connection.commit();

}

catch (SQLException e) { connection.rollback();

}

connection.setAutoCommit(true);

Introspection 21 / 25

Introduction Description dereflect JDBC Pr´esentation Fonctionnement de base Exemple

TestJDBC.java

public class TestJDBC {

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

Class.forName("org.postgresql.Driver");

Connection connection;

connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/nicolasdb",

"nicolas","nicolas");

Personne p1 = new Personne(1,"Avuleur","´Edith", 1983);

p1.writeObjectInBD(connection);

Personne p2 = new Personne(2,"Azutat","Laure", 1960);

p2.writeObjectInBD(connection);

Personne p3 = new Personne(1, connection);

System.out.println(p3);

connection.close();

} catch (ClassNotFoundException e) {

System.err.println("Le driver n’est pas accessible");

e.printStackTrace(System.err);

} } }

Introspection 22 / 25

Introduction Description dereflect JDBC Pr´esentation Fonctionnement de base Exemple

Cr´ eation de la table personnes

DROP TABLEpersonnes;

CREATE TABLEpersonnes (

id_personneINTEGER NOT NULL, nomVARCHAR(100)NOT NULL, prenomVARCHAR(100), anneeINTEGER,

PRIMARY KEY(id_personne) );

Introduction Description dereflect JDBC Pr´esentation Fonctionnement de base Exemple

Personne.java (. . . )

public class Personne { private int id;

private String nom;

private String prenom;

private int annee;

public Personne(intid, String nom, String prenom,intannee) { this.id = id;

this.nom = nom;

this.prenom = prenom;

this.annee = annee;

}

public Personne(intid, Connection connection)throwsSQLException { this.id = id;

booleanres = readObjectFromBD(connection);

if (!res) id = 0;

}

public int getId() { returnid;

}

(7)

Introduction Description dereflect JDBC Pr´esentation Fonctionnement de base Exemple

Personne.java

public booleanreadObjectFromBD(Connection connection)throwsSQLException { Statement transaction = connection.createStatement();

ResultSet resultat = transaction.executeQuery("SELECT * FROM personnes WHERE id_personne="+id);

if (resultat.next()) {

nom = resultat.getString("nom");

prenom = resultat.getString("prenom");

annee = resultat.getInt("annee");

return true;

}

return false;

}

public voidwriteObjectInBD(Connection connection)throwsSQLException { Statement transaction = connection.createStatement();

if (readObjectFromBD(connection))

transaction.executeUpdate("UPDATE personnes

SET nom=’"+nom+"’, prenom=’"+prenom+"’, annee="+annee+"

WHERE id_personne="+id);

else

transaction.executeUpdate("INSERT INTO personnes (id_personne, nom, prenom, annee) VALUES ("+id+",’"+nom+"’,’"+prenom+"’,"+annee+")");

connection.commit();

}

public String toString() {

returngetClass().getName()+"("+id+") : "+prenom+" "+nom+" ("+annee+")";

} }

Introspection 25 / 25

Références

Documents relatifs

Ceci implique une approche pluridisciplinaire pr´ esentant les diff´ erents niveaux d’´ etude (mol´ ecules, cellules, organismes, popu- lations) en faisant appel aux connaissances

En effet de nos jours l’utilisation de nouvelles m´ ethodes d’acquisition de donn´ ees ` a base d’imagerie (synchrotron ...) ou de s´ equen¸ cages de g´ enomes s’est g´

´ electromagn´ etisme, m´ ecanique quantique, physique statistique, atomique et mol´ ecuaire et physique des solides), une formation exp´ erimentale pouss´ ee, et une solide

Ce module a pour objet la simulation num´ erique par ´ el´ ements finis des ph´ enom` enes non lin´ eaires auxquels peuvent ˆ etre soumises les pi` eces m´ ecaniques : grands

le stage a pour principaux objectifs de finaliser la formation scientifique et technique par la mise en pratique des comp´ etences acquises, de se confronter ` a des probl´

Chaque UE obtenue est ainsi affect´ ee d’un certain nombre d’ECTS (en g´ en´ eral 30 par semestre d’enseignement). Le nombre d’ECTS est fonction de la charge globale de

Les objectifs p´ edagogiques sont : 1- de travailler l’anglais scientifique sur les publications servant de support au sujet de recherche d´ evelopp´ e dans les UE Mod´ elisation

Gestion du risque microbiologique - Ecologie microbienne dans les aliments - Microbiologie pr´ evisionnelle - Crit` eres microbiologiques - Plans d’´ echantillonnage -D´