refleksje i rzutowanie

0

Mam klasę C implementującą interfejs I
Cały JAR został załadowany dynamicznie, udało mi się stworzyć instancję klasy C, jak ją teraz rzutować na interfejs I ?
Mam coś takiego:

Object casted = f.getType().cast(instance);

gdzie 'f' jest zmienną prywatną jakiegoś tam obiektu i jest typu I a 'instance' jest instancją klasy C.
Przy próbie uruchomienia dostaję wyjątek:

java.lang.ClassCastException
        at java.lang.Class.cast(Unknown Source)
0
C obiektC;
I interfejsI = (I)obiektC;

?

0

Jesli chcesz robic rzutowanie na C, to znaczy ze C znasz w czasie kompilacji i wiesz ze I jest naprawde C. Wtedy mozesz uzyc takiego rzutowania jak kolega powyzej lub podobnej konstrukcji ktora uzyles sam.
Pytanie za 100 pktow: skoro w czasie kompilacji wiesz ze I bedzie C, to na cholere uzywasz refleksji? Refleksje uzywasz wtedy gdy faktycznie nie wiesz czy do I przypiszesz C, czy A czy Misiu, bo klasy sa np w pliku konf (np jsk uzywasz Spring z XML).
Bottomline: to co chcesz zrobic jest bez sensu. Jak wiesz ze I bedzie C to po prostu wywolaj C() czy cokolwiek, bez reflekcji bo tylko komplikujesz banalna sprawe - stworzenei obiektu. Refleksje uzywasz tworzac C za pomoca newInstance czy czegos, rzutujesz na interfejs i dalej uzywasz zgodnie z interfejsem I, i nie interesuje cie czy to C czy Kleks. Przemysl sprawe.

0

No dobra, może źle się wyraziłem, dokładnie to mam takie coś:

            ExternalObject ext = f.getAnnotation(ExternalObject.class);
            if (ext != null) {
                f.setAccessible(true);
                String className = ext.className();
                Class externalClassInstance = getClass(className);
                Object instance = CommandInvoker.getInstance(externalClassInstance, Boolean.FALSE);
                Object casted = f.getType().cast(instance); // tutaj wyrzuca wyjątek
                f.set(CommandInvoker.getInstance(classInstance, false), casted);
            }
0

Może dodam jeszcze, że powyższy kawałek kodu jest w:

        for (Field f : classInstance.getDeclaredFields()) {
            ...
        }
0

Ktoś mi odpowie ?

0

Widocznie typ sie nie zgadza i juz. Nie rozumiem na co ci to rzutowanie, jak i tak przypisujesz do Object - przecieŻ to nic nie zmienia. Nada!

0

Zrob sobie sysout
instance.getClass() oraz f.getType() i bedziesz wiedzial czemu sie typy nie zgadzaja

A przypisanie do Object i kastowanie nie ma sensu jak kolega wyzej zauwazyl

0

Ok, wyżej troche przesadziłem, ale po dokładniejszym sprawdzeniu okazało się, że przyczyna leży gdzie indziej. Wygląda to tak, że mam programik, który ładuje dynamicznie 2 różne JAR'y, pierwsza paczka zawiera klasę i jej interfejs, druga paczka tylko ten interfejs. Kiedy próbuję inicjalizować obiekt w klasie paczki drugiej to nie mogę do tego interfejsu przypisać obiektu z paczki pierwszej. Ktoś z Was próbował robić coś takiego ?

0

Dobra problem rozwiązany, gdyby to kogoś interesowało, to problemem było, że każda paczka dostawała swój URLClassLoader, dziedziczący po domyślnym, dlatego 'komunikacja' między klasami paczek nie chciała działać bo nie było komunikacji horyzontalnej. Rozwiązałem to, tworząc łańcuch URLLoaderów, podając przy tworzeniu nowego, ostatnio stworzony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1