webForumDet fria alternativet

Kontrollera dynamiskt laddad klass' ursprung?

9 svar · 368 visningar · startad av SPiN

SPiNMedlem sedan mars 20007 896 inlägg
#1

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
#2

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
#3

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
#4

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
#5

Ja, jag antog nästan det... Rätt kass faktiskt, men det får väl gå ändå. :)

antilizaerMedlem sedan apr. 200357 inlägg
#6

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
#7

Jo, det är kanske möjligt... Ska se över den möjligheten också. Tack. :)

LimeMedlem sedan sep. 2001961 inlägg
#8

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
#9

Vad sägs om en stor portion RTFM? ;)

SPiNMedlem sedan mars 20007 896 inlägg
#10

Ooh, det verkar vara vad jag är ute efter. Tackar spango. :D

Mysko att jag inte sett den metoden... :)

137 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)