12 Metaprogrammering i Java

Relevanta dokument
Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Lösningsförslag till tentamen

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

DAT043 - föreläsning 8

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Static vs Dynamic binding Override vs Overload. Objekt-orienterad programmering och design Alex Gerdes och Sólrún Halla Einarsdóttir, 2018

Lösningsförslag till tentamen

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Polymorfi. Objektorienterad och komponentbaserad programmering

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

DAT043 Objektorienterad Programmering

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Java, klasser, objekt (Skansholm: Kapitel 2)

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

Kopiering av objekt i Java

Föreläsning 5-6 Innehåll

Konstruktion av klasser med klasser

Kort om klasser och objekt En introduktion till GUI-programmering i Java

OOP Objekt-orienterad programmering

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Lösningar till tentamen i EDAF25

Lösningar för tenta 3 DAT043,

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Klasshierarkier - repetition

OOP Objekt-orienterad programmering

Föreläsning 3: Händelsestyrda program och användargränssnitt

Classes och Interfaces, Objects och References, Initialization

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Fortsättningskurs i programmering F 5. GUI händelsehantering - undantagshantering Hugo Quisbert AWT. Paket för hantering av grafik

Generiska konstruktioner. Kursbokens kapitel 13

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Programmering för språkteknologer II, HT2014. Rum

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Objekt, Klasser, Paket m. m.

TENTAMEN OOP

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Att skriva till och läsa från terminalfönstret

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Upplägg. Introduktion. Examination. Mål. Konsekvenser. Java. Kursen heter konstruktion, ej design eller formgivning.

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

PROGRAMMERINGSTEKNIK TIN212

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Lösningar till tentamen i EDAF25

Objektorienterad Programmering (TDDC77)

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Algoritmer. Två gränssnitt

Modeller, Objekt och Klasser

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Objektorienterad programmering med Java, Generics

Objektorienterad Programmering DAT043

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

F4. programmeringsteknik och Matlab

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Grundläggande programmering DVG A08 & ISG A04. Allmän information. Å vem är jag då. Karlstads Universitet, Johan Öfverberg 1

DAT043 - Föreläsning 7

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Föreläsning 8 - del 1: Objektorienterad programmering (forts.) - Exempel

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

Objektorienterad Programmering (TDDC77)

Arv. Objektorienterad och komponentbaserad programmering

Outline. Objektorienterad Programmering (TDDC77) Laborationsserie del två. Vad händer under HT2. Introduktion HT2 UML.

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Parallellism, återblick

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Transkript:

12 Metaprogrammering i Java Reflektion, introspektion, metaprogrammering Reflektion i Java Klassladdning Tillämpningar (Litteratur: se sista sidan) Flexibilitet Utbyggbarhet Plugginbarhet Vad handlar det om? Så här får man väl inte göra? String MinTyp = int ; MinTyp i; eller får man det? och vad skulle det vara bra för? Svar: 1) Ja i princip. 2) Tveksamt i det här fallet, men 1 2 Detta! Så här får man göra (något förenklat): String MinTyp = Klassnamn ; Class cl = laddaklass(mintyp); Object obj = cl.görobjekt(); obj.metod(); komponentbaserad programmering en applikation kan använda nya klasser som tillkommer efter kompileringen av applikationen minimal koppling mellan applikationer och komponenter 3 Reflektiv programmering Reflektion i programmering är förmågan hos ett program att använda eller modifiera sin egen kod eller kod i omgivningen synonym: metaprogrammering, introspektion använda en sträng under exekveringen som om innehållet vore källkod konvertera en sträng som matchar det symboliska namnet på en klass eller metod till en referens till klassen, eller anrop av metoden När ett programmeringsspråk stöder reflektiv programmering sparas typinformation i källkoden tillsammans med den kompilerade koden (.class-filen i Java) I Java representeras (reflekteras) sådan information under exekveringen i objekt av speciella metaklasser klassen Game reflekteras av ett objekt av metaklassen Class 4 Användningsområden Enterprise Computing (storskaligt) Java Beans, RMI (Remote Method Invokation) manipulering av objekt med mjukvaruverktyg verktyget använder reflektion för att analysera eller ändra egenskaper hos dynamiskt laddade komponenter Designmönster (småskaligt) generella factory-klasser generella lyssnare m.m. I Java finns flera metoder för att hantera typinformation under exekveringen instanceof Klassliteraler int.type, Command.class ger ett klassobjekt av typen Class som reflekterar typen Reflektion 5 6

Med instanceof kan man testa den dynamiska typen hos ett objekt if ( cmd instanceof GoCommand ) ((GoCommand)cmd).execute(); else if ( puh! många fall blir det void printclassname(object obj) { System.out.println("The class of " + obj + " is " obj.getclass().getname()); Kräver att klassen är känd vid kompileringen eftersom klassen måste namnges Klasshierarkin avspeglas strukturellt i koden Förändringar i hierarkin kräver motsvarande förändringar i koden Fallanalyssyndromet switch-satser System.out.println("The name of class Foo is:" + Foo.class.getName()); 7 8 Reflektion i Java den flexibla metoden reflektion! reflekterade klasser kan vara okända vid kompileringen laddas dynamiskt under exekveringen typkontroll sker även här, men vid run-time - hur kan man använda en okänd klass? Hur kan man använda en okänd klass? Utanför applikationen (komponenter): 1. Definiera ett gränssnitt, t.ex. public interface Command { public void execute(); 2. Definiera subklasser till Command antag att gränssnittet Command är känt i applikationen, men inte subklasserna med Javas reflektionsmekanism kan subklasserna användas i applikationen, trots att de ej är kända där vid kompileringen Fördel: Programmet kan frikopplas från klasshierarkin nya subklasser kräver ej omkompilering av applikationen 9 10 Hur kan man använda en okänd klass? Inuti applikationen: 3. Ladda någon av de okända subklasserna String klassnamn; laddade_subklassen = laddaklass(klassnamn); 4. Skapa ett objekt av den laddade klassen laddade_subklassen objektet; 5. Typomvandla till Command: Command obj = (Command)objektet; obj.execute(); Klassladdning En klass laddas under exekveringen av JVM (Java Virtual Machine) från en.class-fil när ett objekt av klassen används första gången. För varje klass som laddas av JVM skapas ett motsvarande objekt av metaklassen Class som beskriver (reflekterar) den laddade klassen. Objektet innehåller bl.a. klassens statiska variabler. Alltså: Den laddade klassens namn måste förstås anges vid laddningen, men namnet behöver inte vara känt vid kompileringen, det räcker om det är känt vid run-time! 11 12

Applikation Klassnamn Class klassobjekt objekt objekt.metod(); Dynamisk klassladdning instansiera använd leta upp ladda Externa komponenter Klassnamn.class Javas metaklasser Class objekt av denna klass reflekterar klasser och interface Constructor reflekterar konstruktorer Method reflekterar metoder Field reflekterar attribut Modifier reflekterar accessmodifierare, public, static, m.m. Array reflekterar fält 13 14 static Class forname(string classname) java.lang.class Constructor getconstructor( Class parametertypes) Method getmethod(string name, Class parametertypes) Field getfield(string name) Object newinstance() laddar klassen eller gränssnittet med namnet classname och returnerar dess klassobjekt ger ett konstruktorobjekt med angivna parametertyper ger en metodobjekt med angivna parametertyper ger ett variabelobjekt med angivet namn skapar ett objekt av klassen som reflekteras av detta klassobjekt 15 Varargs = variabla argument I Java finns en möjlighet att skriva metoder som tar ett variabelt antal argument. Ex int f(int a) { int sum = 0; for ( int x : a ) sum += x; return sum; på anrop: f(1); f(1,2); f(45,-17,99) Ekvivalent kod int f(int[] a) { int sum = 0; for ( int x : a ) sum += x; return sum; 16 java.lang.reflect.constructor java.lang.reflect.method Class getdeclaringclass() Class[] getparametertypes() Class[] getexceptiontypes() String getname() ger klassobjektet för klassen som deklarerar konstruktorn som reflekteras av detta konstruktorobjekt ger ett fält av klassobjekt som reflekterar de formella parametrarna till konstruktorn som ger ett fält med alla undantag som kan kastas av konstruktorn ger konstruktorns namn Object invoke(object o,object args) Class[] getparametertypes() Class getreturntype() Class[] getexceptiontypes() String getname() anropar metoden som representeras av detta metodobjekt för objektet o och med parametrarna args ger ett fält av klassobjekt som representerar de formella parametrarna ger metodens returtyp ger ett fält med alla undantag som kan kastas av metoden ger metodens namn 17 18

Exempel // Utan reflektion Klassnamn objekt = new Klassnamn(); objekt.metod(); Namn- och metodnamn är låsta Typkontroll vid kompileringen Hög läsbarhet Namn- och metodnamn kan variera under exekveringen Typkontroll under exekveringen (exceptions) Lägre läsbarhet // Med reflektion Class klassobjekt = Class.forName("Klassnamn"); Method metod = klassobjekt.getmethod("metod",parametertyper); Object objekt = klassobjekt.newinstance(); metod.invoke(objekt,parametrar); 19 Exempel 1: commandfactory public interface Command { public void execute(); public class Take implements Command { public void execute() { // do whatever + Go, Stop, Turn, Quit, etc. Ett något mer utvecklat exempel finns i gamecharacters 20 commandfactory public void processcommand(string commandname) { Command command = getfactorycommand(commandname); command.execute(); public static Command getfactorycommand(string s) { Command command = null; try { // Load the class with name s and instantiate it command = (Command) Class.forName(s).newInstance(); catch (Exception e) { e.printstacktrace(); return command; String cmd; processcommand(cmd); 21 Exempel2: Metoder med parametrar public class C { public void f(integer i) { public void f(string s) { Class cls = Class.forName("C"); Method m = cls.getmethod("f",string.class); Object obj = cls.newinstance(); m.invoke(obj,"hej!"); 22 Exempel 3: Generell lyssnare public class Main extends JFrame implements ActionListener { public Main() { JButton plingbutton = new JButton("pling"); plingbutton.setactioncommand("pling"); plingbutton.addactionlistener(this); add(plingbutton); JButton plongbutton = new JButton("plong"); plongbutton.setactioncommand("plong"); plongbutton.addactionlistener(this); add(plongbutton); JButton klonkbutton = new JButton("klonk"); klonkbutton.setactioncommand("klonk"); klonkbutton.addactionlistener(this); add(klonkbutton); forts. 23 public void pling() { public void plong() { public void klonk() { Generell lyssnare // General listener using reflection public void actionperformed(actionevent ev) { try { this.getclass(). getmethod(ev.getactioncommand()). invoke(this); catch (Exception e) { e.printstacktrace(); 24

this.getclass(). Generell lyssnare getmethod(ev.getactioncommand()). invoke(this); ger klassobjektet för detta objekt Reflekterar action-metodnamnet på ett metodobjekt som reflekterar metoden med detta namn. plong reflekteras på metoden plong() ger namnet på händelseobjektets action-metod ( pling, plong eller klonk ) Litteratur http://docs.oracle.com/javase/tutorial/reflect/index.html En introduktion till javas reflektions-api. Portwood, Michael, Using Java Reflection Technology to Improve Design, Den finns på kurshemsidan ( men var kom originalet ifrån?) En samling OH-bilder som ger en bra översikt. Neward, Ted, Understanding Class.forname(), http://www.idevelopment.info/data/programming/java/reflection/understanding_cla ssforname.pdf En grundlig genomkörare för den som ämnar ge sig på avancerad komponentbaserad programmering. Tar bl.a. upp problemet med olika klassladdare och CLASSPATH i samband med Extensions m.m. Anropar den reflekterade metoden för detta objekt 25 26