Meta Programming and Reflection in Java

Ähnliche Dokumente
Java Reflection. Andreas Lochbihler. 15. Mai Lehrstuhl Programmierparadigmen Universität Karlsruhe

Info B VL 14: Java Collections/Reflections

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Leseprobe. Rainer Oechsle. Java-Komponenten. Grundlagen, prototypische Realisierung und Beispiele für Komponentensysteme

Algorithmen und Datenstrukturen

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Informatik II Übung 6

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

12 Abstrakte Klassen, finale Klassen und Interfaces

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Reflection. Programmieren 2 - H.Neuendorf (131)

Objektorientierung (OO)

Überblick. Class-Objekte. Bietet die Möglichkeit das Laufzeitverhalten von Applikationen zu analysieren und es gegebenenfalls sogar zu beeinflussen

Überblick. Beispiel: get()-methodenaufruf am VSBoard aus Übungsaufgabe 1. Analyse einer Methode: java.lang.reflect.method

OOP. Tagesprogramm. Aspekte und Annotationen. Software-Entwurfsmuster. Factory-Method. Prototype

Interfaces und Vererbung

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Einstieg in die Informatik mit Java

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Informatik II - Tutorium 6

14 Abstrakte Klassen, finale Klassen, Interfaces

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Die abstrakte Klasse Expression:

Verteilte Systeme Übung

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Überblick. Stubs & Skeletons Java Reflection API Dynamische Proxies als Stubs Generische Skeletons Aufgabe 2. VS-Übung (SS17) Stubs & Skeletons 2 1

Übung 1: Object Inspector

Info B VL 11: Innere Klassen/Collections

Vorkurs Informatik WiSe 15/16

Java Grundlagen 2 - OOP

Programmierkurs Java

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Informatik II Musterlösung

Überblick. Java Reflection API. Class-Objekte

II.4.5 Generische Datentypen - 1 -

Annotation in Java 1.5

Allgemeine Informatik II SS :30-11:30 Uhr

II.4.4 Exceptions - 1 -

Fragen zur OOP in Java

Einstieg in die Informatik mit Java

Erste Java-Programme (Java Wiederholung & Vererbung)

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Kapitel 8: Reflection

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Einstieg in die Informatik mit Java

Prüfung Softwareentwicklung II (IB)

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

Das Interface-Konzept am Beispiel der Sprache Java

13. Java Klassen. Lernziele. Klassen - Technisch. Definition: Klassen

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Properties und Proxies

Java I Vorlesung 6 Referenz-Datentypen

Syntax. int a; public A() {...} public void F() {...} }

Java Idioms. Basic und Advanced Java Coding Style. Prof. Dr. Nikolaus Wulff

Reflection. Programmieren 2 - H.Neuendorf (131)

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Informatik II Übung 6

Dateien. DVG Dateien 1

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

7. Objektorientierung. Informatik II für Verkehrsingenieure

IT I: Heute. Nachbetrachtung Wissensüberprüfung. Einführung Vererbung. Roboter in becker.robots. Filialenbelieferung 4.11.

Javakurs für Anfänger

Softwaretechnik WS 16/17. Übungsblatt 01

Tag 8 Repetitorium Informatik (Java)

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Selbststudium OOP1 & DAT Programmieren 2 F1203 Felix Rohrer

JAVA 05: Objektorientierte Konzepte

Universität Karlsruhe (TH)

OOP. Tagesprogramm. Aspektorientierte Programmierung. Annotationen

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Aspektorientierte Programmierung

Info B VL 8: Abstrakte Klassen & Interfaces

Mock-Objekte. Universität Karlsruhe (TH) Fakultät für Informatik Lehrstuhl für Programmiersysteme. Forschungsuniversität gegründet 1825

IT I: Heute. Nachbetrachtung Wissensüberprüfungen. Einführung Vererbung. Roboter in becker.robots. falls Zeit: Scheduling 8.11.

Objekte und Klassen. INE2 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert, E.

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

1 Abstrakte Klassen, finale Klassen und Interfaces

Einführung in das Programmieren Probeklausur Lösungen

Ausnahmebehandlung in Java

Algorithmen und Datenstrukturen II

Instrumentierung und Dekodierung

Vererbung und Polymorphie

Einführung in die Programmiersprache Java II

13. Java Klassen. Klassen, Typen, Objekte, Deklaration, Instanzierung, Konstruktoren, Kapselung, statische Felder und Methoden

Kapitel 5: Interfaces

Transkript:

Meta Programming and Reflection in Java

Overview instanceof operator Java Annotations Java Reflection

instanceof operator vergleicht ein Objekt mit einem bestimmten Typ testet ob ein Objekt ist eine Instanz einer Klasse eine Instanz einer Unterklasse eine Instanz einer Klasse, die eine Interface implementiert null ist nicht eine Instanz einer Klasse

instanceof operator class Parent { class Child extends Parent implements MyInterface { interface MyInterface { Parent obj1 = new Parent(); Parent obj2 = new Child(); obj1 instanceof Parent: true obj1 instanceof Child: false obj1 instanceof MyInterface: false obj2 instanceof Parent: true obj2 instanceof Child: true obj2 instanceof MyInterface: true

instanceof operator interface Printable{ class A implements Printable{ public void a(){system.out.println("a method"); class B implements Printable{ public void b(){system.out.println("b method"); class Call{ void invoke(printable p){ if(p instanceof A){ A a=(a)p;//downcasting a.a(); if(p instanceof B){ B b=(b)p;//downcasting

Java Annotations Art von Metadata bietet über das Programm Information, die nicht direkt zum Programm gehört haben keine direkte Auswirkung auf die Ausführung des Codes

Annotations Information für den Compiler mit dem Ziel Errors zu entdecken Warnings aufzuheben Compile-Time Verarbeitung Werkzeuge können Annotations nutzen um Code, XML Dateien usw. zu erzeugen Laufzeit Verarbeitung Manche Annotations sind am Laufzeit geprüft

Annotation Basics @ zeigt dem Compiler, dass der Ausdruck eine Annotation deklariert @Entity Annotations können Elemente enthalten @Entity(tableName = "vehicles", primarykey = "id")

Beispiel @Entity public class Vehicle { @Persistent protected String vehiclename = null; @Getter public String getvehiclename() { return this.vehiclename; public void setvehiclename(@optional vehiclename) { this.vehiclename = vehiclename; public List addvehiclenametolist(list names) { @Optional List localnames = names; if(localnames == null) { localnames = new ArrayList(); localnames.add(getvehiclename()); return localnames;

Vordefinierten Annotations @Deprecated zeigt dass das Element soll nicht mehr benutzt sein // Javadoc comment follows /** * @Deprecated * explanation of why it was deprecated */ @Deprecated static void deprecatedmethod() {

Vordefinierten Annotations @Override zeigt dass das Element ein Element von der Bassisklasse überschriebt // mark method as a superclass method // that has been overridden @Override int overriddenmethod() {

Vordefinierten Annotations @SuppressWarnings zeigt den Compiler Warnings aufzuheben // use a deprecated method and tell // compiler not to generate a warning @SuppressWarnings("deprecation") void usedeprecatedmethod() { // deprecation warning // - suppressed objectone.deprecatedmethod();

Benutzerdefinierten Annotations Benutzerdefinierten Annotations sind erlaubt Annotations sind in ihren eigenen Datei definiert @interface MyAnnotation { String value(); String name(); int age(); String[] newnames();

Benutzerdefinierten Annotations @MyAnnotation( value="123", name="abc", age=0, newnames={"aaa", "BBB" ) public class MyClass {

Java Reflection Bestimmen die Klasse eines Objektes Daten über eine Klasse Zugriffsmodifikatoren Basisklasse Eigenschaften Methoden Erlaubt Instanzen erzeugen Methoden Aufrufen Eigenschaften verändern

Was genau ist eine Klasse Eine Sammlung von Felder Methoden Konstruktoren Durch Reflection werden wir solche Dinge nicht definieren sondern zugreifen

Programming vs Reflecting Wir werden Reflection nutzen, um Objekte, die schon existieren, zu ändern Wir können dynamisch den Zustand eines Objektes, egal wie die Objekte implementiert sind Im Endeffekt können wir Objekte zur Laufzeit ändern Programme haben Zugriff auf strukturelle Repräsentation ihrer selbst

Laufzeit? Der typische Ablauf wäre Klassen, Methoden umsetzen Compile Ausführung Änderungen erfordern den Code nochmal zu compilieren und auszuführen

Reflection Typische Anwendungsfälle Erstellen von Objekten der Klassen, deren Typ unbekannt zur Kompilierzeit sind Dynamische Objekterzeugung + Manipulation + Methodenaufrufe Testing Debugging

Java.lang.reflect.* Method beschreibt die Methoden einer Klasse und erlaubt Zugriff Field beschreibt die Felder einer Klasse: Name, Typ usw Constructor<T> schafft Info über die Konstruktoren und erlaubt die Ausführung eines Konstruktor, um Instazen zu erzeugen

Wie beginnen wir java.lang.class der Bauplan der Klasse Class<? extends Object> theclass = ClassName.class; Class theclass = Class.forName( package.class ); bewirkt Laden des zugehörigen class-files durch ClassLoader

Felder getfields() Alle public Felder in der Klasse (und auch von den Basisklassen) getdeclaredfields() Gibt ein Array mit allen Felder zurück getfield(string name) Gibt das Feld mit einem bestimmten Name zurück

Felder get(object obj) Gibt den Wert des Feldes zurück getprimitivetype(object obj) set(object obj, Object value) Verändert den Wert des Feldes setprimitivetype(object obj, PrimitiveType value) gettype() Gibt den Typ des Feldes zurück getname() Gibt den Name zurück

Methoden getmethods() Alle public Methoden in der Klasse (und auch von den Basisklassen) getdeclaredmethods() Gibt alle Methoden zurück

Methoden getname() Gibt den Name der Methode zurück getreturntype() Gibt den Typ des Rückgabewertes der Methode zurück getparametertypes() Gibt den Typ der Parameters zurück invoke(object obj, Object... args) Ruft die Methode mit bestimmten Parameters auf

Aufruf einer Methode getmethod(string name, Class<?>... parametertypes); public int dosomething(string stuff, int times, int max){ getmethod( dosomething, String.class, int.class, int.class);

Konstruktoren getconstructors() getdeclaredconstructors() getconstructor(class<?>... parametertypes);

AccessibleObject isaccessible() public Methoden, Felder, Konstruktoren geben True zurück alle andere geben False zurück setaccessible(boolean flag)

Demo import java.lang.annotation.* ; import java.lang.reflect.* ; @Retention(RetentionPolicy.RUNTIME) @interface Copyright { String author(); int year();

Demo @Copyright(author="cat", year=2018) class T { public void f () { System.out.println("f() in T"); private void f (String x) { System.out.println(x + " -> f() in T"); private String x; public T (String x) { this.x = x;

Demo public class main { public static void main (String[] arg) throws Exception { Class cls = null; cls = Class.forName( "T" ) ; Copyright cr = (Copyright) cls.getannotation( Copyright.class ) ; System.out.println(cr.author()); System.out.println(cr.year()); Constructor c = cls.getconstructor(string.class); Object clsi = c.newinstance("aaa"); //Object clsi = cls.newinstance(); //for (Method m : cls.getmethods()) Method m = cls.getmethod("f"); m.invoke(clsi); m = cls.getdeclaredmethod("f", String.class); m.setaccessible(true); m.invoke(clsi, "10"); Field f = cls.getdeclaredfield("x"); f.setaccessible(true); System.out.println(f.get(clsi));