ΕΠΛ233 ΠΛΗΡΟΦΟΡΙΑ ΤΥΠΟΥ. Type Information. Μ. Δικαιάκος

Σχετικά έγγραφα
Υπερφόρτωση (Overloading) Υπέρβαση (Overriding) - Upcasting Downcasting Final classes, methods

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

Εκτέλεση εξωτερικών προγραμμάτων και εντολών The Java Reflection - Αρχικοποίηση (Initialization)

Διδάσκων: Παναγιώτης Ανδρέου

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA


Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Εισαγωγή στον Προγ/μό Η/Υ

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

9:00-10:00 π.μ. (60 λεπτά) Παρασκευή, 14 Οκτωβρίου, 2016

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

Κλάσεις και Αντικείµενα

Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα μέσα σε αντικείμενα Αντικείμενα ως επιστρεφόμενες τιμές Αντικείμενα με πίνακες

Αντικειµενοστρεφής Προγραµµατισµός

Τμήμα Πολιτικών Μηχανικών και Μηχανικών Περιβάλλοντος ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής, :00-10:00 π.μ.

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Έλεγχος ισότητας String Interning Αποαναφοροποίηση - dereferencing

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Πακέτα (Packages) Φωλιασμένες ή Εσωτερικές Κλάσεις (Inner Classes) Παναγιώτης Σφέτσος, PhD

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Βασικά της γλώσσας JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

2.1 Αντικειµενοστρεφής προγραµµατισµός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΑΝΑΚΕΦΑΛΑΙΩΣΗ. Τα βασικά για την γλώσσα Java

API: Applications Programming Interface

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Η λέξη κλειδί this. Γαβαλάς Δαμιανός

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Wrapper Classes, Abstract Classes and Interfaces

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΑΦΗΡΗΜΕΝΕΣ ΚΛΑΣΕΙΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες Μέθοδοι tostring και equals Αντικείμενα μέσα σε αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι String Interning

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors, equals, tostring Αντικείμενα ως παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

ΕΠΛ233 Βασικά στοιχεία προγραµµατισµού στη JAVA

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

Κλάσεις. Τροποποιητές, ιασυνδέσεις, Πακέτα. Τροποποιητές ελέγχου προσπέλασης µεταβλητών και µεθόδων

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2007 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

Εξαιρέσεις (Exceptions) Λάθη (Errors) Χειρισμός των Εξαιρέσεων (Exception Handling) Assertions

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΑΤΕΙ Θεσσαλονίκης Τμήμα Πληροφορικής

Προγράμματα με δομή Κληρονομικότητας

Αντικειμενοστρεφής Προγραμματισμός

02 Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

Βασικά Στοιχεία της Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Ευφυείς Τεχνολογίες ----Πράκτορες

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΑΠΛΗ ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΘΕΜΑΤΑ ΕΞΕΤΑΣΕΩΝ ΟΜΑΔΑ Α

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Copy Constructor Deep and Shallow Copies

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Transcript:

ΕΠΛ233 ΠΛΗΡΟΦΟΡΙΑ ΤΥΠΟΥ Type Information

2 Δυναμική Πληροφορία Τύπου Runtime type information (RTTI): μας επιτρέπει να ανακαλύπτουμε και να χρησιμοποιούμε δυναμικά (at run time) πληροφορίες για τον τύπο των αντικειμένων. H JAVA μας επιτρέπει να ανακαλύπτουμε δυναμικά πληροφορίες σχετικές με τον τύπο αντικειμένων και κλάσεων, με δύο τρόπους: Την παραδοσιακή RTTI, όπου υποτίθεται ότι όλοι οι τύποι είναι διαθέσιμοι και γνωστοί ήδη από την στιγμή της μεταγλώττισης Τον μηχανισμό ενδοσκόπησης (reflection), ο οποίος μας επιτρέπει να ανακαλύπτουμε και να χρησιμοποιούμε πληροφορία κλάσης/τύπου στο χρόνο εκτέλεσης (δυναμικά) ΕΠΛ233

3 import java.util.*; abstract class Shape { void draw() { System.out.println(this +.draw() ); abstract public String tostring(); class Circle extends Shape { public String tostring() { return Circle ; class Square extends Shape { public String tostring() { return Square ; class Triangle extends Shape { public String tostring() { return Triangle ; public class Shapes { public static void main(string[] args) { List<Shape> shapelist = Arrays.asList( new Circle(), new Square(), new Triangle); for (Shape shape: shapelist) shape.draw();

4 Τι τρέχει; List<Shape> shapelist = Arrays.asList( new Circle(), new Square(), new Triangle); Αναβάθμιση (upcasting) σε Shape. Εδώ χάνουμε την πληροφορία του εξειδικευμενου τύπου των αντικειμένων που μπαίνουν στη λίστα. for (Shape shape: shapelist) shape.draw(); Η λίστα κρατάει τα περιεχόμενά της σαν Object. Όταν εξάγουμε ένα αντικείμενο από τη λίστα, αναβαθμίζεται αυτόματα σε Shape. Εδώ συμβαίνει RTTI καθώς ελέγχεται η συμβατότητα της αναβάθμισης δυναμικά (δηλ. ότι το Object που εξήγαμε είναι Shape. Στη συνεχεία συβαίνει ο πολυμορφισμός, ώστε να κληθεί η κατάλληλη Draw. ΕΠΛ233

Τα αντικείμενα Class Μ. Δικαιάκος ΕΠΛ233 Η δυναμική απεικόνιση των τύπων στη JAVA γίνεται χάρη στα αντικείμενα τύπου Class. Για κάθε κλάση ενός προγράμματος JAVA υπάρχει ένα αντίστοιχο αντικείμενο τύπου Class, το οποίο ενσωματώνει πληροφορίες για την κλάση-τύπο του. Κάθε φορά που γράφουμε και μεταγλωττίζουμε μια κλάση JAVA, δημιουργείται ένα αντικείμενο Class, το οποίο αποθηκεύεται σε αρχείο.class Για να κατασκευάσουμε ένα αντικείμενο, ο JVM, μέσω του οποίου τρέχει το πρόγραμμά μας, χρησιμοποιεί το υποσύστημα classloader για να φορτώσει δυναμικά το αντικείμενο της αντίστοιχης κλάσης. Επομένως, ένα πρόγραμμα JAVA δεν είναι πλήρως φορτωμένο στη μνήμη πριν ξεκινήσει να τρέχει, αλλά τμήματά του φορτώνονται όποτε χρειαστεί. 5

6 Φόρτωση αντικειμένου κλάσης Ο classloader: ελέγχει πρώτα αν το αντικείμενο Class για τον τύπο του αντικειμένου που κατασκευάζεται είναι ήδη φορτωμένο. Αν όχι, αναζητεί το αντίστοιχο.class αρχείο στο σύστημα αρχείων (συμβουλευόμενο και το classpath) Καθώς διαβάζει το αρχείο, επικυρώνει (verifies) το περιεχόμενό του ώστε να επιβεβαιώσει ότι δεν πρόκειται για παραποιημένο κώδικα (για λόγους ασφάλειας). Από τη στιγμή που το αντικείμενο Class έχει ανασυσταθεί στην μνήμη του JVM, χρησιμοποιείται για να δημιουργηθούν αντικείμενα αυτού του τύπου. ΕΠΛ233

7 class Candy { static { System.out.println("Loading Candy"); class Gum { static { System.out.println("Loading Gum"); class Cookie { static { System.out.println("Loading Cookie");

8 public class SweetShop { public static void main(string[] args) { System.out.println("inside main"); new Candy(); System.out.println("After creating Candy"); try { Class.forName("Gum"); catch(classnotfoundexception e) { e.printstacktrace(system.err); System.out.println( "After Class.forName(\"Gum\")"); new Cookie(); System.out.println("After creating Cookie");

8 public class SweetShop { public static void main(string[] args) { System.out.println("inside main"); new Candy(); System.out.println("After creating Candy"); try { Class.forName("Gum"); catch(classnotfoundexception e) { e.printstacktrace(system.err); System.out.println( "After Class.forName(\"Gum\")"); new Cookie(); System.out.println("After creating Cookie"); inside main Loading Candy After creating Candy Loading Gum After Class.forName( Gum ) Loading Cookie After creating Cookie

Πρόσβαση σε αντικείμενα Class Μ. Δικαιάκος ΕΠΛ233 Τα αντικείμενα τύπου Class, συμπεριφέρονται όπως όλα τα αντικείμενα της JAVA Αποκτώντας χειριστήριο σε ένα αντικείμενο Class μπορούμε να έχουμε δυναμική πρόσβαση σε πληροφορία τύπου (κατά την εκτέλεση του προγράμματός μας): Η πληροφορία τύπου βρίσκεται στο αντικείμενο Class. Απόκτηση πρόσβασης σε αντικείμενα Class: Class.forName( sought_class_name ) this.getclass() - αν έχουμε ήδη πρόσβαση σε αντικείμενο της κλάσης ClassName.class - κυριολέκτημα κλάσης (class literal):ελέγχεται τη στιγμή της μεταγλώττισης για το αν υπάρχει το ClassName) 9

10 package typeinfo.toys; interface HasBatteries { interface Waterproof { interface Shoots { class Toy { // Comment out the following default // constructor to see // NoSuchMethodError from (*1*) Toy() { Toy(int i) { class FancyToy extends Toy implements HasBatteries, Waterproof, Shoots { FancyToy() { super(1);

11 public class ToyTest { static void printinfo(class cc) { System.out.println("Class name: " + cc.getname() + " is interface? [" + cc.isinterface() + "]"); System.out.println( Simple name: + cc.getsimplename()); System.out.println( Canonical name: + cc.getcanonicalname()); public static void main(string[] args) { Class c = null; try { c = Class.forName("typeinfo.toys.FancyToy"); catch(classnotfoundexception e) { System.exit(1); printinfo(c); for (Class face: c.getinterfaces()) printinfo(face);

11 public class ToyTest { static void printinfo(class cc) { System.out.println("Class name: " + cc.getname() + " is interface? [" + cc.isinterface() + "]"); System.out.println( Simple name: + cc.getsimplename()); System.out.println( Canonical name: + cc.getcanonicalname()); public static void main(string[] args) { Class c = null; try { c = Class.forName("typeinfo.toys.FancyToy"); catch(classnotfoundexception e) { System.exit(1); printinfo(c); for (Class face: c.getinterfaces()) printinfo(face); Επιστρέφει πίνακα αντικειµένων Class για τις διαπροσωπείες που περιέχονται στο αντικείµενο κλάσης

12 Class up = c.getsuperclass(); Object obj = null; try { // Requires default constructor: obj = up.newinstance(); // (*1*) catch(instantiationexception e) { System.out.println( Cannot instantiate ); System.exit(1); catch(illegalaccessexception e) { System.out.println( Cannot access ); System.exit(1); printinfo(obj.getclass());

Class name: typeinfo.toys.fancytoy is interface? [false] Simple name: FancyToy Canonical name: typeinfo.toys.fancytoy Class name: typeinfo.toys.hasbatteries is interface? [true] Simple name: HasBatteries Canonical name: typeinfo.toys. HasBatteries Class name: typeinfo.toys.waterproof is interface? [true] Simple name: Waterproof Canonical name: typeinfo.toys.waterproof Class name: typeinfo.toys.shoots is interface? [true] Simple name: Shoots Canonical name: typeinfo.toys.shoots Class name: typeinfo.toys.toy is interface? [false] Simple name: Toy Canonical name: typeinfo.toys.toy Μ. Δικαιάκος 13

14 Κυριολεκτήματα Κλάσεων ΕΠΛ233 Δημιουργία χειριστηρίου σε αντικείμενο Class με χρήση κυριολεκτήματος κλάσης (class literal). Π.χ.: FancyToy.class Στην περίπτωση δημιουργίας χειριστηρίου σε αντικείμενο τύπου Class με χρήση κυριολεκτήματος, δεν αρχικοποιείται απαραίτητα το αντικείμενο Class. Βήματα: Φόρτωση (loading): από τον class loader - βρίσκει τα bytecodes της κλάσης και δημιουργεί ένα αντικείμενο Class από αυτά. Σύνδεση (linking): επικύρωση των bytecodes της κλάσης και δέσμευση μνήμης για στατικά πεδία δεδομένων. Επίλυση αναφορών σε άλλες κλάσεις. Αρχικοποίηση (initialization): αρχικοποίηση στατικών μελών (συμπεριλαμβανομένων αρχικοποιητών προγόνων και ιδίας): η αρχικοποίηση καθυστερεί μέχρι να γίνει η πρώτη αναφορά σε στατική μέθοδο ή σε μή στατικά πεδία.

import java.util.*; class Initable { static final int staticfinal = 47; static final int staticfinal2 = ClassInitialization.rand.nextInt(1000); static { System.out.println("Initializing Initable"); class Initable2 { static int staticnonfinal = 147; static { System.out.println("Initializing Initable2"); class Initable3 { static int staticnonfinal = 74; static { System.out.println("Initializing Initable3"); 15

public class ClassInitialization { public static Random rand = new Random(47); public static void main(string[] args) throws Exception { Class initable = Initable.class; System.out.println("After creating Initable ref"); // Does not trigger initialization: System.out.println(Initable.staticFinal); // Does trigger initialization: System.out.println(Initable.staticFinal2); // Does trigger initialization: System.out.println(Initable2.staticNonFinal); Class initable3 = Class.forName("Initable3"); System.out.println("After creating Initable3 ref"); System.out.println(Initable3.staticNonFinal); Μ. Δικαιάκος 16

17 After creating Initable ref 47 Initializing Initable 258 Initializing Initable2 147 Initializing Initable3 After creating Initable3 ref 74