812347A Olio-ohjelmointi, 2016 X Reflektiivisyys
Sisältö 1. Luokkainformaatio 2. Olion luominen luokkaolion avulla 3. Metodit olioina 2
Luokkainformaatio n Reflektio: Mahdollisuus ohjelman suorituksen aikana tarkastella sen ominaisuuksia n Luokkainformaation saamiseksi monissa kielissä luokkaolioita: oliot vastaavat ohjelmointikielen luokkia Java: luokka Class n Javassa reflektiivisyyteen liittyvät luokat joko pakkauksessa java.lang tai java.lang.reflect 3
Luokkainformaatio Javassa n Luokka Class Javassa laaja Saadaan luokasta paljon informaatiota n Tunnetusta luokasta (OmaLuokka) saa luokkaolion Class myclass = OmaLuokka.class; n Luokan emoluokan luokkaolio Class superclass = myclass.getsuperclass(); n Yleensä haetaan olion luokkainformaatio: OmaLuokka ol = new OmaLuokka(); Class aclass = ol.getclass(); 4
Luokkainformaatio public class LuokkaDemo_1 {! public static void main( String [] args ){!! Class myclass = LuokkaDemo_1.class;! printclassname( myclass );!! Class superclass = myclass.getsuperclass();! printclassname( superclass );!! LuokkaDemo_1 ld1 = new LuokkaDemo_1();! Class aclass = ld1.getclass();! printclassname( aclass );!! static void printclassname(object obj) {! System.out.println("Olion \"" + obj +! "\" luokka on " +! obj.getclass().getname());! 5
Luokkainformaatio java LuokkaDemo_1 Olion "class LuokkaDemo_1" luokka on java.lang.class Olion "class java.lang.object" luokka on java.lang.class Olion "class LuokkaDemo_1" luokka on java.lang.class 6
Olion luominen luokkaolion avulla n Onnistuu Javassa luokkaolion avulla n Ohjelmassa luokka class OmaLuokka { public OmaLuokka() { } } n Olion luonti Class classobj = Class.forName("OmaLuokka"); Object obj = classobj.newinstance(); n Onnistuu, jos luokalla parametriton konstruktori 7
Olion luominen luokkaolion avulla public class LuokkaDemo_1 {! public static void main(string [] args)throws InstantiationException, ClassNotFoundException,IllegalAccessException {!! Class classobj = Class.forName("OmaLuokka");! Object obj = classobj.newinstance();! printclassname( classobj );! static void printclassname(object obj) {! System.out.println("Olion \"" + obj +! "\" luokka on " +! obj.getclass().getname());! class OmaLuokka {! public OmaLuokka() {! System.out.println("Luotiin OmaLuokka-olio");! 8
java LuokkaDemo_1 Luotiin OmaLuokka-olio Olion "class OmaLuokka" luokka on java.lang.class 9
Olion luominen luokkaolion avulla (2) n Luokan konstruktorien saaminen: Class-luokan metodi public Constructor<?>[] getconstructors() throws SecurityException Palauttaa taulukon, jossa kaikki konstruktorit public Constructor<T> getconstructor(class<? >... parametertypes) throws NoSuchMethodException, SecurityException Palauttaa konstruktorin, jolla annettu parametrilista n Olio luodaan kutsumalla konstruktorin newinstancemetodia Voidaan antaa parametrilista 10
Metodit olioina n Javassa luokkien metodit ovat olioita Luokka java.lang.reflect.method n Luokan omat metodit voidaan selvittää luokan Class metodilla public Method[] getdeclaredmethods() throws SecurityException Luokassa määritellyt ja uudelleenmääritellyt Konstruktorit metodilla getconstrucutors n Metodia voidaan kutsua Method-luokan metodilla public Object invoke(object obj, Object... args) throws IllegalAccessException, // etc 11
Metodit olioina! OmaLuokka! omal = new OmaLuokka(1, "aa");!! Class omaclass = om1.getclass();! Method met1 = omaclass.getmethod( "tostring",new Class[] {} );! String jono = (String) met1.invoke(omal, new Object[] {} );! System.out.println("toString palautti: " + jono);! tostring palautti: Value: 1 Name: aa 12!
Metodit olioina: käyttökohteita n Harvoin normaaliohjelmoinnissa tarpeen n Hyödyllistä graafisissa kehitysympäristöissä, joissa ohjelmoijan on päästävä käsiksi komponenttien ominaisuuksiin ja metodeihin n Olioiden hajauttaminen helpompaa Voidaan selvittää dynaamisesti olion metodit ja parametrit 13