Refleksje w Javie

Poszukując nowych i ciekawych zastosowań Javy trafiłem na wzmiankę o mechanizmie pozwalającym ładować biblioteki (klasy) dynamicznie w trakcie działania programu. Właściwie to należało się spodziewać, że będzie to możliwe… Tak czy inaczej mechanizm ten nazwano Refleksjami.

Poszukałem trochę na temat tych refleksji i trafiłem na tutorial jak ich używać: http://www.programowanieobiektowe.pl/java_obiekty_refleksyjne.php.

Niestety to co się dzieje na tamtej stronie – w celu wykorzystania jednego malego obiektu bije na głowę nawet ładowanie zewnętrznych bibliotek w C… Dzieje się tak dlatego, że zakładamy, że dana bibioteko-klasa nie będzie miała nic wspólnego z naszym projektem. Widać zatem, że można załadować w ten sposób każdą klasę. Tylko po co skoro można to zrobić dużo, dużo prościej i przyjemniej. Czyniąc sobie pewne założenia na temat ładowanej klasy możemy znacznie uprościć używanie tej klasy zewnętrznej.

Jeśli mamy zamiar stworzyć sobie możliwość dodawania pluginów do własnego programu to prawdopodobnie stworzymy sobie interfejs Plugin. I tak na prawdę to tyle całkowicie wystarczy aby uprościć sprawę. Pokażę to „w kodzie”:

Plik Plugin.java:

interface Plugin {
    public String sayHello();
}

Plik MyPlugin.java który będzie ładowany dynamicznie:

class MyPlugin implements Plugin {
    public String sayHello() {
        return "Hello World!";
    }
}

No i teraz jeśli chcemy wykorzystać nasz plugin to wystarczy gdzieś wcisnąć coś takiego:

try {
    Plugin plugin = (Plugin) Class.forName("MyPlugin").newInstance();
    System.out.println(plugin.sayHello());
} catch(Exception e) {
    e.printStackTrace();
}

Jest to znacznie prostsze niż sprawdzanie każdej metody i jej argumentów jednak ma ograniczenie w postaci przymusu implementacji przez ładowaną klasę odpowiedniego interfejsu. No ale nie jest to chyba przeszkoda nie do przejścia 🙂

Reklamy

Jedna myśl nt. „Refleksje w Javie

  1. Dla bezpieczeństwa możemy zrobić tak:

    Object o = Class.forName(„MyPlugin”).newInstance()
    if( o instanceof Plugin ) {
    Plugin plugin = (Plugin) o;
    }

    Dzięki temu program nie bedzie robił problemu jeśli ktoś wrzuci plugin, który nie będzie się odpowiednio zachowywał 😉

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s