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
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
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
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
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
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;
}
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