SPiNMedlem sedan mars 20007 896 inlägg Häpp!
Jag försöker komma runt ett problem jag har suttit med ett tag, och inte fått till en riktigt fin lösning på. Jag skapar ett objekt dynamiskt på ett ställe, lägger in i en ArrayList och vill sedan kunna kontrollera dess ursprung samt superklasser på ett annat ställe. Operatorn instanceof trodde jag skulle lösa mina problem, men icke...
Object object = Class.forName( "ett.paket.och.EnKlass" ).newInstance();
enArrayList.add( object );
Object object = enArrayList.get( index );
if( object instanceof Class.forName( "ett.paket.och.EnKlass" ) ) {
System.out.println( "Instans av ett.paket.och.EnKlass." );
}
Det här fungerar ju inte riktigt som jag vill, man kan inte använda Class.forName() där.
Visst kan jag annars göra ett fulhack som endast kollar gentemot en konkret klass och inte mot superklasser eller implementationer, men det vill jag helst undvika:
Object object = enArrayList.get( index );
if( object.getClass().getName().equals( "ett.paket.och.EnKlass" ) ) {
..
Förslag, någon?
ViktorMedlem sedan aug. 20021 752 inlägg Jag får denna kod att fungera, kanske löser ditt problem
public class Test
{
public static void main(String args[])
{
try
{
Object object = Class.forName("is4.db.Test3").newInstance();
if(object instanceof is4.db.Test3)
System.out.println("OK");
else
System.out.println("NOT OK");
}
catch(Exception e)
{
}
}
}
Klassen Test ligger i rooten på paketet och Test3 ligger såklart i is4.db.Test3 :)
När jag kör så skriver den ut "OK".
/Viktor
SPiNMedlem sedan mars 20007 896 inlägg Visst, jag vet att det fungerar. Men grejjen är den att jag även jämför mot ett dynamiskt värde, så jag kan inte göra så heller. Tyvärr. :)
ViktorMedlem sedan aug. 20021 752 inlägg
Visst, jag vet att det fungerar.
:r Självklart! Bara jag som är så dum, har faktiskt aldrig använt instanceof på det sättet förut men när jag tänker 1 sekund längre så är det ju exakt så man gör i vanliga fall, dvs när man testar med inbyggda java klasser :OO
Ser ganska mörkt ut tycker jag, hittade även denna text på javas hemsida och det bekräftar väll bara det som du har märkt, att det inte går att skriva något annat än en typ som op2,
op1 must be the name of an object and op2 must be the name of a class. An object is considered to be an instance of a class if that object directly or indirectly descends from that class.
/Viktor
SPiNMedlem sedan mars 20007 896 inlägg Ja, jag antog nästan det... Rätt kass faktiskt, men det får väl gå ändå. :)
Kan du inte skriva en metod som, rekursivet går igenom en klass eventuella superklasser och interface med hjälp av metoderna:
Class superClass = object.getClass().getSuperclass();
och
Class[] interfaces = object.getClass().getInterfaces();
SPiNMedlem sedan mars 20007 896 inlägg Jo, det är kanske möjligt... Ska se över den möjligheten också. Tack. :)
LimeMedlem sedan sep. 2001961 inlägg Personligen tycker jag att det är taskig modellering om du inte ens vet vilket interface eller basklass en dynamiskt laddad implementation stödjer. Hur ska du då veta vad du kan göra med klassen.
"Jo, jag har fått in en klass av typen Gummilurka och jo, jag har kollat, det är en Gummilurka..."
Nä, den typen av programmering går bort.
spangoMedlem sedan juni 20008 205 inlägg Vad sägs om en stor portion RTFM? ;)
SPiNMedlem sedan mars 20007 896 inlägg Ooh, det verkar vara vad jag är ute efter. Tackar spango. :D
Mysko att jag inte sett den metoden... :)