Sources JavaConsultez toutes les sources
Nombre d'auteurs : 29, nombre de sources : 134, création le 13 avril 2013
- Thread : Priority Inversion Safe Binary Semaphore
- JNI : vider la console (C)
- JNI : Récuperer le types des disques (Delphi)
- Exemple de pile LIFO utilisant LinkedList
- Pile/File pour les débutants
- Modification dynamique du classpath
- Mécanisme de plugins au sein d'une application Java
- Requêtes multiples avec JDBC et JSP
- Connexion à une base de données quelconque
- Ordonnanceur : mini-OS
- Analyser les capacités d'une classe
- IndexedMap
Synchroniser des threads de priorites différentes.
Le mot cle synchronized utilise un sémaphore binaire qui n'empêche pas l'inversion de priorités, celui ci si, en utilisant le mécanisme d'héritage des priorités.
De plus sa file d'attente est prioritaire : le thread de plus haute priorité passe en premier.
Et pour l'utiliser, voici le parallele avec l'utilisation de synchronized :
//
créer
le
sémaphore
Object o =
new
Object
();
//
prendre
le
sémaphore
et
attendre
si
necessaire
synchronized
(o){
//
rendre
le
sémaphore
}
//
créer
le
sémaphore
PISBSem sem =
new
PISBSem
();
//
prendre
le
sémaphore
et
attendre
si
necessaire
sem.take
();
//
rendre
le
sémaphore
sem.give
();
Cet exemple met en évidence l'utilisation de JNI (Java Native Interface). Il permet de vider la console. Le code C utilisé est théoriquement "portable", il suffira de le recompiler selon la plateforme utilisée. Il suffit d'appeler :
ClearScreen.clear
();
Cet exemple met en évidence l'utilisation de JNI (Java Native Interface) en combinaison avec du code Delphi.
Exemple d'utilisation :
String drive =
"
c:\\
"
;
int
type =
DriveInfo.getDriveType
(drive);
switch
(type){
case
DriveInfo.FIXED :
System.out.println
("
c:\\
est
un
disque
dur
"
);
break
;
default
:break
;
}
boolean
amovible =
DriveInfo.isRemovable
(drive);
System.out.println
("
c:\\
amovible
:
"
+
amovible);
File[] roots =
File.listRoots
();
for
(int
i =
0
; i <
roots.length; i+
+
){
File root =
roots[i];
String name =
root.getPath
();
System.out.println
(name+
"
:
"
+
DriveInfo.getDriveInfo
(name));
}
Le but n'est pas de réinventer la roue, mais juste d'utiliser une classe qui porte le nom 'Stack' ou 'Pile' pour plus de clarté dans le code source sans plomber les performances avec la classe Stack de Java 1.
L'implémentation proposée ici est basée sur le modèle des collections de Java2, elle utilise une interface Stack et une classe concrète LinkedStack.
Voici un petit prog qui présente le principe de la pile et de la file avec une pointe de polymorphisme (naturel en java). Ce code est surtout destiné aux étudiants BAC+2 puisque c'est une architecture que l'on étudie en cours. Donc rien de bien extraordinaire mais au moins il marche très bien !
Bien qu'il ne soit pas possible de modifier dynamiquement le classpath, cette classe permet de contourner le problème en appelant directement la méthode protégée "addURL" du ClassLoader. Utilisant l'introspection, cette classe permet également d'appeler toutes les méthodes privées et protégées de n'importe quel objet.
Cet outil permet de lister une catègorie de plugins disponible.
Il permet l'abstraction de l'emplacement physiques des plugins.
Ceux-ci peuvent être dans plusieurs JAR, des repertoires etc.
La recherche des plugins se fait sur 3 critères :
- Accessiblent par le classpath de l'application
- Doivent se trouver dans un package determiné (sous-packages inclus)
- Doivent hériter d'une classe mère de plugin (definit par vos soin)
Cette classe à pour rôle de vous aider a réaliser un mécanisme de plugins au sein d'une application JAVA.
package
org.XXXXXXXX;
import
java.util.*;
import
java.util.zip.*;
import
java.io.*;
import
java.net.*;
/**
*
PluginInspector
*
Ce
module
s
'
occupe
de
dresser
une
liste
des
"
plugins
"
disponibles
au
sein
d
'
une
application
JAVA
*
Ce
code
n
'
est
qu
'
a
titre
d
'
exemple
sur
comment
faire
un
outils
permettant
d
'
ajouter
des
plugins
.
*
*
L
'
idée
de
cet
inspecteur
est
d
'
imposer
un
package
pour
les
plugins
et
d
'
utiliser
le
classLoader
afin
*
de
determiner
toutes
les
classes
.
*
Il
est
ainsi
possible
de
rajouter
par
la
suite
un
fichier
JAR
contenant
de
nouveaux
plugins
et
qu
'
ils
*
soient
automatiquement
pris
en
comptes
par
l
'
application
(
pour
peu
que
le
fichier
JAR
soit
rajouté
correctement
au
classpath
)
*
*
Un
"
PluginInspector
"
s
'
appuie
sur
deux
elements
pour
identifier
les
plugins
*
-
Le
package
de
recherche
(
ainsi
que
tous
les
sous
-
packages
)
*
-
La
classe
mère
des
plugins
afin
de
s
'
assurer
qu
'
une
classe
est
effectivement
un
plugin
*
*
Il
est
possible
d
'
avoir
plusieurs
"
PluginInspector
"
pour
gérer
differentes
natures
de
plugins
*
*
Exemple
:
*
-
les
plugins
sont
installés
dans
le
package
org
.
myApplic
.
plugins
*
-
La
classe
mère
des
plugins
est
org
.
myApplic
.
util
.
Plugin
*
*
Récuperation
des
plugins
de
l
'
application
:
*
Iterator
plugins
=
new
PluginInspector
(
"
org
.
myApplic
.
plugins
"
,
org
.
myApplic
.
util
.
Plugin
.
class
)
.
plugins
(
)
;
*
while
(
plugins
.
hasNext
(
)
)
*
{
Class
plugin
=
(
Class
)
plugins
.
next
(
)
;
*
System
.
out
.
println
(
"
Plugin
Loaded
:
"
+
plugin
)
;
*
}
*
*
Remarque
:
le
PluginInspector
charge
les
classes
lors
de
l
'
examen
,
ce
qui
n
'
est
pas
un
mauvais
choix
pour
*
un
mécanisme
de
plugins
,
mais
ce
mécanisme
pourait
être
assez
pénalisant
pour
un
usage
detourné
*
*
@author
André
Sébastien
*/
public
class
PluginInspector {
/**
Nom
du
package
des
plugins
*
*/
private
String pluginPackage =
null
;
/**
Classe
mere
de
tous
les
plugins
*
*/
private
Class pluginHomeClass =
null
;
/**
Repertoire
(
en
terme
de
resource
)
des
plugins
*
*/
private
String pluginResourceName =
null
;
/**
Repertoire
(
en
terme
de
fileSystem
)
des
plugins
*
*/
private
String pluginFileName =
null
;
/**
Liste
des
plugins
*
*/
private
List plugins =
new
ArrayList
();
/**
Filtre
utilisé
lors
d
'
un
examen
de
repertoire
physique
*
*/
private
static
final
FileFilter filter =
new
FileFilter
()
{
public
boolean
accept
(File pathname)
{
if
(pathname.isDirectory
() ) return
true
;
if
(!
pathname.isFile
() ) return
false
;
String path =
pathname.getAbsolutePath
();
if
( !
path.endsWith
("
.class
"
) ) return
false
;
if
( path.indexOf
('
$
'
) >=
0
) return
false
;
return
true
;
}
}
;
/**
Constructeur
*
@param
packageName
Package
dont
doivent
faire
partie
les
plugins
(
sous
-
packages
compris
)
*
@param
pluginHomeClass
Class
mére
de
tous
les
plugins
,
si
null
alors
,
il
sera
considéré
Object
.
class
comme
class
mère
de
tous
les
plugins
*
*/
public
PluginInspector
(String packageName , Class pluginHomeClass )
{
/**
Initialisation
*
*/
this
.pluginPackage =
packageName;
this
.pluginHomeClass =
pluginHomeClass;
if
( this
.pluginHomeClass =
=
null
) this
.pluginHomeClass =
Object.class
;
/**
On
calcul
le
repertoire
d
'
acces
aux
repertoires
*
*/
this
.pluginResourceName =
this
.pluginPackage.replace
('
.
'
,'
/
'
);
this
.pluginFileName =
this
.pluginPackage.replace
('
.
'
, File.separatorChar );
/**
Lance
l
'
examen
de
l
'
application
*
*/
this
.examine
();
}
/**
Retourne
la
liste
des
plugins
accessiblent
(
objets
"
Class
"
)
*
*/
public
Iterator plugins
()
{
return
this
.plugins.iterator
(); }
/**
Examine
l
'
application
pour
determiner
les
plugins
accessibles
*
*/
private
void
examine
()
{
try
{
Enumeration e =
this
.getClass
().getClassLoader
().getResources
( this
.pluginResourceName );
while
( e.hasMoreElements
() )
{
URL url =
(URL)e.nextElement
();
String protocol =
url.getProtocol
();
if
( protocol.equals
("
file
"
) ) this
.examineFromDirectory
( new
File
(url.getFile
() ) );
else
if
( protocol.equals
("
jar
"
)) this
.examineFromJar
(url);
}
}
catch
(Exception e){
e.printStackTrace
(); }
}
/**
Examine
les
plugins
à
partir
d
'
un
repertoire
physique
*
*/
private
void
examineFromDirectory
(File directory)
{
if
( !
directory.isDirectory
() ) return
;
try
{
File[] files =
directory.listFiles
( this
.filter );
for
(int
i =
0
; i <
files.length ; i+
+
)
{
File file =
files[i];
if
( file.isDirectory
() )
{
this
.examineFromDirectory
( file );
continue
;
}
/**
Transformer
le
chemin
en
package
*
*/
String name =
file.getAbsolutePath
();
int
pos =
name.indexOf
( this
.pluginFileName );
if
( pos =
=
-
1
) continue
;
name =
name.substring
( pos , name.length
() -
6
).replace
( File.separatorChar , '
.
'
);
/**
Charger
le
plugin
*
*/
Class plugin =
this
.getClass
().forName
(name);
if
( !
this
.pluginHomeClass.isAssignableFrom
( plugin ) ) continue
;
if
( this
.plugins.contains
( plugin ) ) continue
;
this
.plugins.add
(plugin);
}
}
catch
(Exception e){
e.printStackTrace
(); }
}
/**
Examine
les
plugins
à
partir
d
'
un
JAR
*
*/
private
void
examineFromJar
(URL url)
{
String jarName =
url.getFile
();
jarName =
jarName.substring
( jarName.indexOf
('
:
'
) );
jarName =
jarName.substring
(0
, jarName.indexOf
('
!
'
) );
jarName =
jarName.replace
('
/
'
, File.separatorChar );
try
{
ZipFile zipFile =
new
ZipFile
(jarName);
Enumeration e =
zipFile.entries
();
while
( e.hasMoreElements
() )
{
ZipEntry entry =
(ZipEntry)e.nextElement
();
String name =
entry.getName
();
if
( !
name.endsWith
("
.class
"
) ) continue
;
if
( !
name.startsWith
( this
.pluginResourceName ) ) continue
;
if
( name.indexOf
('
$
'
) >=
0
) continue
;
/**
suppression
du
.
class
et
remise
sous
forme
de
package
*
*/
name =
name.substring
(0
, name.length
() -
6
);
name =
name.replace
('
/
'
,'
.
'
);
/**
Charger
le
plugin
*
*/
Class plugin =
this
.getClass
().forName
(name);
if
( !
this
.pluginHomeClass.isAssignableFrom
( plugin ) ) continue
;
if
( this
.plugins.contains
( plugin ) ) continue
;
this
.plugins.add
(plugin);
}
zipFile.close
();
}
catch
(Exception e){
e.printStackTrace
(); }
}
}
Voici un exemple qui va vous permettre d'envoyer un ensemble de requêtes simultanément à une base de données, les réponses de chaque requête s'afficheront dans des tableaux dans la page JSP ... un exemple du résultat (la capture d'écran quoi !) se trouve dans le fichier ZIP au format PDF. Attention : ce code n'est pas un exemple à prendre pour de la bonne prog, c'est un peu bourrin ... c'est un truc que j'avais fait rapidement en cours ...
La classe SQLService permet de se connecter à une base de donnée quelconque et d'effectuer des requêtes SQL transmises sous forme d'une chaîne de caractères. Les réponses sont également fournies sous forme de chaînes de caractères. Le programme SQLInterface est une interface graphique mettant en oeuvre la classe SQLService en proposant deux exemples: une connexion à une base MySQL et une connexion à un fichier Microsoft Access.
Voici le résultat d'un exercice d'un cours de temps réel : un ordonnanceur non temps réel !!!! Le programme suivant présente la structure d'un mini système d'exploitation (ordonnanceur principalement !), la structure du programme n'est pas celle réellement d'un vrai système d'exploitation notamment à du passage d'objet en paramètres et le manque d'interruptions et de boîtes aux lettres mais au moins cela montre les ordonnanceurs (priorité, aléatoire, réparti)!!!
J'y ai joint un petit document (mon compte rendu de TP) afin que vous compreniez ce qu'est un ordonnanceur pour ceux qui ne savent pas ... et c'est à l'intérieur que vous aurez l'ensemble des commandes ainsi que les paramètres !!!!
Un petit fichier d'aide vous montre comment procéder !!! LISEZ LE !!!!
@+
Ce code vous demande de saisir un nom d'objet et il affiche tous les constructeur, méthodes, champs et parent de cet objet.
Implémentation d'une Map gérant en interne une "List" afin de pouvoir ordonner et récuperer les éléments de la Map a travers des "index". cf la javadoc de la classe pour plus de details.