OVH Cloud OVH Cloud

Singleton

2 réponses
Avatar
Frederic WOEHL
Salut à tous,

J'ai plusieurs classes du type

public class c1 {
private static c1 c = null ;
private c1( ) {
}
public static synchronized c1 getInstance( ) {
if( c == null ) {
c = new c1( ) ;
}
return c ;
}
public HashMap getHM( ) {
return aHMfromsomewhere ;
}
}

Mon problème est que ces diverses classes (c1,c2 etc...) possèdent
toutes la meme structure mais dans des packages diverses.
Je veux, par exemple, instancier c2 juste en connaisant son nom
(pack1.pack2.c2), je fait :

Class c = Class.forName( "pack1.pack2.c2" ) ;

et ensuite je suis dans le gaz:
- Si j'essaye de déclarer une interface avec getInstance et getHM
j'obtient un castexception
- Si j'essaye de faire un getMethod dur getInstance puis un invoke,
j'obtient un Object que je ne sais pas caster en Class: C'est à dire:
Class c = Class.forName( "pack1.pack2.c2" ) ;
Method m1 = ccrl.getMethod( "getInstance", null ) ;
Object o = m1.invoke( c, null ) ;
System.out.println( o ) ; // affiche: pack1.pack2.c2@12345
Class c2 = ( Class )o ; // <== cast exception (pourtant le print
précédant à une bonne tete...)
Method m2 = c2.getMethod( "getHM", null ) ;


C'est peut être à cause du lundi mais je suis un peu bloqué dans ma tete
la...

Merci d'avance pour vos réponses,
FRED

2 réponses

Avatar
Tom
Salut à tous,

Class c2 = ( Class )o ; // <== cast exception (pourtant le print
précédant à une bonne tete...)



Salut,

J'ai lu en diagonale, mais le ClassCastException me semble normal... tu
convertis un objet en une classe... Il faut faire appel à la méthode
getClass() pr récupérer son objet 'Class'...

Tom

Avatar
Frederic WOEHL
Je me repond à moi meme !
It was a little bit tricky...

Le bon code:
Class c = Class.forName( "pack1.pack2.c2" ) ;
Method m1 = ccrl.getMethod( "getInstance", null ) ;
Object o = m1.invoke( c, null ) ;
System.out.println( o ) ;
Class c2 = ( Class )o.getClass( ) ; // bien mieux...
Method m2 = c2.getMethod( "getHM", null ) ;
m2.invoke( o, null ) ; // et surtout pas m2.invoke( c2, null )

FRED


Frederic WOEHL wrote:

Salut à tous,

J'ai plusieurs classes du type

public class c1 {
private static c1 c = null ;
private c1( ) {
}
public static synchronized c1 getInstance( ) {
if( c == null ) {
c = new c1( ) ;
}
return c ;
}
public HashMap getHM( ) {
return aHMfromsomewhere ;
}
}

Mon problème est que ces diverses classes (c1,c2 etc...) possèdent
toutes la meme structure mais dans des packages diverses.
Je veux, par exemple, instancier c2 juste en connaisant son nom
(pack1.pack2.c2), je fait :

Class c = Class.forName( "pack1.pack2.c2" ) ;

et ensuite je suis dans le gaz:
- Si j'essaye de déclarer une interface avec getInstance et getHM
j'obtient un castexception
- Si j'essaye de faire un getMethod dur getInstance puis un invoke,
j'obtient un Object que je ne sais pas caster en Class: C'est à dire:
Class c = Class.forName( "pack1.pack2.c2" ) ;
Method m1 = ccrl.getMethod( "getInstance", null ) ;
Object o = m1.invoke( c, null ) ;
System.out.println( o ) ; // affiche:
Class c2 = ( Class )o ; // <== cast exception (pourtant le print
précédant à une bonne tete...)
Method m2 = c2.getMethod( "getHM", null ) ;

C'est peut être à cause du lundi mais je suis un peu bloqué dans ma tete
la...

Merci d'avance pour vos réponses,
FRED