JAVA. Třídy a classloader

Podobné dokumenty
JAVA. Třídy a classloader

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Bakalářská práce. Vizualizace a editace molekul proteinu

Vláknové programování část V

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Programování v Javě I. Leden 2008

Programování v Javě I. Únor 2009

Úvod do programovacích jazyků (Java)

JAVA Moduly Java, letní semestr 2018

Teoretické minimum z PJV

Platformy NetBean a Eclipse. Úvod

RMI Remote Method Invocation

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

JAVA. Krátce o Reflection API

Platformy NetBean a Eclipse. Úvod

Iterator & for cyklus

Java Výjimky Java, zimní semestr

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Algoritmizace a programování

Podmínky na zápočet. Java, zimní semestr

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

Abstraktní datové typy: zásobník

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Generické programování

Java Enum Java, zimní semestr ,2017 1

Java a XML. 10/26/09 1/7 Java a XML

1. Programování proti rozhraní

Reflexe RTTI Runtime Type Identification

JAVA V RMI Java, letní semestr

Java Virtual Mchine. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

8 Třídy, objekty, metody, předávání argumentů metod

Remote Method Invocation RMI

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

PREPROCESOR POKRAČOVÁNÍ

Seminář Java II p.1/43

UNIVERZITA PARDUBICE. Fakulta elektrotechniky a informatiky. Volání nativního kódu z javovské aplikace pomocí JNI Jan Žampach

Úvod do programovacích jazyků (Java)

Principy objektově orientovaného programování

Programování v C++ 2, 4. cvičení

ANT. Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

IUJCE 07/08 Přednáška č. 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Datové struktury. alg12 1

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Úvod do programovacích jazyků (Java)

JAVA RMI Java, letní semestr 2018

Algoritmizace a programování

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

RMI - Distribuované objekty v Javě

Java - výjimky. private void vstup() throws IOException {... }

Objektově orientované programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

JAVA. Další jazyky kompilovatelné do Java byte-code

Úvod do programování v jazyce Java

Jazyk C# (seminář 6)

GUI. Systémová integrace pro desktopové aplikace

20. Projekt Domácí mediotéka

IRAE 07/08 Přednáška č. 1

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Distribuované systémy a výpočty

11. Dědičnost. Dědičnost strana 103

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

David Bednárek Jakub Yaghob Filip Zavoral.

Pokročilé programování na platformě Java. Úvod

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Programování v C++ 1, 1. cvičení

ADT/ADS = abstraktní datové typy / struktury

Čipové karty Lekařská informatika

Zápis programu v jazyce C#

JAVA. Reflection API

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

JAVA. Java Management Extensions JMX

Katedra měřicí a řídicí techniky, VŠB - Technická univerzita v Ostravě, tř. 17. listopadu, Ostrava-Poruba, Česká republika

UJO Framework. revoluční architektura beans. verze

KTE / ZPE Informační technologie

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE PŘEKLADY TYPICKÝCH JAZYKOVÝCH KONSTRUKCÍ PROGRAMOVACÍCH JAZYKŮ.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Soketové připojení Klient InetAddress getbyname() UnknowHostException SecurityException Socket getinputstream() getoutputstream() IOException Server

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Výčtový typ strana 67

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

České vysoké učení technické v Praze. Diplomová práce Podpůrné nástroje pro RTPS komunikaci

1. Téma 12 - Textové soubory a výjimky

Programování v C++ 1, 5. cvičení

PB161 Programování v jazyce C++ Přednáška 10

Transkript:

JAVA Třídy a classloader

Přehled třídy se do VM natahují dynamicky lze změnit odkud se natahují jak se natahují java.lang.classloader VM používá classloadery pro natahovaní tříd každá třída je natažena nějakým classloaderem Class.getClassLoader() výjimka třídy pro pole vytvářeny automaticky, když je potřeba Class.getClassLoader() vrací stejnou třídu jako pro elementy pole

Postup natahování tříd do VM 1. natažení třídy classloader může způsobit výjimky (potomci LinkageError) ClassCircularityError ClassFormatError NoClassDefFoundError může nastat i OutOfMemoryError 2. "linking"

Postup natahování tříd do VM 2. "linking" verification test, zda třída odpovídá Java Virtual Machine Specification výjmky (potomci LinkageError) VerifyError preparation vytvoření static atributů ne inicializace OutOfMemoryError resolution symbolické reference na další třídy výjimky IncompatibleClassChangeError a potomci IllegalAccessError, InstantiationError, NoSuchFieldError, NoSuchMethodError, UnsatisfiedLinkError

Postup natahování tříd do VM 3. inicializace 4. vytvoření nové instance

Třída a classloader třída je ve VM určena nejen jménem ale i classloaderem jedna třída natažená různými classloadery => z pohledu VM dvě různé třídy každý classloader má předka (teď ne dědičnost) výjimka bootstrap classloader nemá předka pokud se nespecifikuje => systémový classloader při natahování třídy classloader nejdříve deleguje natažení na předka a pokud ten třídu nenalezl, natáhne classloader třídu sám

Třída a classloader pokud jsou při natahování třídy potřeba další třídy, natahují se stejným classloaderem

Vlastní classloader potomek od java.lang.classloader předefinovat metodu findclass() class MyClassLoader extends ClassLoader { public Class<?> findclass(string name) { byte[] b = loadclassdata(name); return defineclass(name, b, 0, b.length); } } private byte[] loadclassdata(string name) {... } použití Class.forName("trida", true, new MyClassLoader()); nebo new MyClassLoader().loadClass("trida");

Vlastní classloader lze předefinovat i metody loadclass() nevhodné činnost metody findloadedclass() test, zda je třída už natažená deleguje natažení na rodičovský classloader findclass() resolveclass()

Příklady použití natažení tříd z různých zdrojů např. ze sítě private byte[] loadclassdata(string name) throws ClassNotFoundException { URL url = new URL("..."); URLConnection con = defurl.openconnection(); InputStream is = con.getinputstream(); ByteArrayOutputStream bo = new ByteArrayOutputStream(); int a = is.read(); while (a!= -1) { bo.write(a); a = is.read(); } is.close(); byte[] ar = bo.tobytearray(); bo.close(); return ar; }

Příklady použití RMI automatické stahování stubů po síti klient vzdálený objekt vo.metoda(); metoda() { } stub skeleton metoda() { } metoda() { } volání po síti

Příklady použití oddělení jmenných prostorů (Java 9 lepší řešení použít moduly) př. aplikační server jedna VM "aplikace" jsou natahovány vlastními classloadery mohou využívat různé verze stejných knihoven (různé třídy se stejnými názvy) nastávají problémy, pokud spolu "aplikace" chtějí přímo komunikovat řešení pro komunikaci se používají interfacy a třídy natažené společným předkem (classloaderem) nevhodné řešení použití reflection API

Načítání dalších zdrojů classloader může načítat cokoliv načítání se řídí stejnými pravidly metody URL getresource(string name) InputStream getresourceasstream(string name) Enumeration<URL> getresources(string name)

Java Service loader & provides

Přehled mějme nějaký interface pro nějakou službu př. javax.xml.parsers.documentbuilderfactory různí dodavatelé implementace služby pokud bychom chtěli použít v programu, museli bychom jméno implementace mít napevno v kódu při změně dodavatele nutno změnit kód lépe => použijeme ServiceLoader<S>

Použití implementaci zabalit do JAR přidat do JAR soubor META-INF/services/jmeno.interfacu.služby př: META-INF/services/javax.xml.parsers.DocumentBuilderFactory v něm co řádek, to jméno třídy implementující interface v kódu sl = ServiceLoader.load(interface.class, classloader); sl.iterator() ServiceLoader je až od JDK 6 META-INF/services se používá už od JDK 1.3 bylo nutné si obdobu ServiceLoaderu napsat ručně explicitně podporován moduly (od Java 9)

JAVA Bytecode

Bytecode The Java Virtual Machine Specification, Java SE 9 Edition http://docs.oracle.com/javase/specs/jvms/se9/html/ index.html

Formát class souboru ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; }

Formát class souboru magic 0xCAFEBABE

Kód zásobníkový assembler void spin() { int i; for (i = 0; i < 100; i++) { ; } } Method void spin() 0 iconst_0 // Push int constant 0 1 istore_1 // Store into local variable 1 (i=0) 2 goto 8 // First time through don't increment 5 iinc 1 1 // Increment local variable 1 by 1 (i++) 8 iload_1 // Push local variable 1 (i) 9 bipush 100 // Push int constant 100 11 if_icmplt 5 // Compare and loop if less than (i<100) 14 return // Return void when done

Instrukce opcodes velikost 1 byte max 256 možných instrukcí ne všechny jsou použité kategorie instrukcí load a store (aload_0, istore,...) aritmetické a logic (ladd, fcmpl,...) konverzie typů (i2b, d2i,...) vytváření objektů a manipulace s nimi (new, putfield) manipulace s operandy na zásobníku (swap, dup2,...) řízení běhu (ifeq, goto,...) volání metod a návrat (invokespecial, areturn,...)

Instrukce invokedynamic od Java 7 podpora pro překlad dynamických jazyků do Java bytekódu od Java 8 použita i pro překlad lambda výrazů

Bytecode nástroje pro práci s byte kódem ASM, BCEL, SERP,... ASM http://asm.ow2.org/ manipulace s bytekódem vytváření nových tříd upravování existujících

JAVA JNI (Java Native Interface)

Přehled integrace nativního kódu (v C, C++,...) do Javy integrace Java kódu do nativního kódu obvyklé použití platformě závislé operace

Příklad class HelloWorld { public native void displayhelloworld(); static { System.loadLibrary("hello"); } } public static void main(string[] args) { new HelloWorld().displayHelloWorld(); }

Příklad javac -h <output_dir> HelloWorld.java (starý způsob javah -jni HelloWorld) > HelloWorld.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: displayhelloworld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject); #ifdef cplusplus } #endif #endif

Příklad naimplementovat nativní metodu #include <jni.h> #include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("hello world!\n"); }

Příklad přeložit nativní kód (HelloWorld.c) výsledek sdílená knihovna (.so,.dll) UNIX gcc -shared -Wall -fpic -o libhello.so -I/java/ include -I/java/include/linux HelloWorld.c Windows cl -Ic:\java\include -Ic:\java\include\win32 -LD HelloWorldImp.c -Fehello.dll spustit program java HelloWorld

Mapování typů Java Type Native Type Size in bits boolean jboolean 8, unsigned byte jbyte 8 char jchar 16, unsigned short jshort 16 int jint 32 long jlong 64 float jfloat 32 double jdouble 64 void void n/a

Mapování typů "neprimitivní" typy jobject jstring jclass jthrowable jarray jobjectarray jbooleanarray jintarray...array

Přístup ke Stringům typ jstring nelze přímo použít převést na char* Java_...(JNIEnv *env, jobject obj, jstring prompt) { char *str = (*env)->getstringutfchars(env, prompt, 0); printf("%s", str); (*env)->releasestringutfchars(env, prompt, str);... nový string char buf[128];... jstring jstr = (*env)->newstringutf(env, buf);

Přístup k polím Java_..._sumArray(JNIEnv *env, jobject obj, jintarray arr) { int i, sum = 0; jsize len = (*env)->getarraylength(env, arr);... jint *body = (*env)->getintarrayelements(env,arr,0); for (i=0; i<len; i++) { sum += body[i]; }... (*env)->releaseintarrayelements(env, arr, body, 0); return sum; }

Přístup k metodám JNIEXPORT void JNICALL Java_..._nativeMethod(JNIEnv *env, jobject obj, jint i) { jclass cls = (*env)->getobjectclass(env, obj); jmethodid mid = (*env)->getmethodid(env, cls, "method", "(I)V"); (*env)->callvoidmethod(env, obj, mid, i); } signatura metody program javap javap -s trida Z boolean Signatura Java typ B C S I J F D Ltřída; [typ (parametry)navratový-typ byte char short int long float double třída typ [] metoda

Přístup k metodám GetMethodID() GetStaticMethodID() CallVoidMethod() CallIntMethod()... CallStaticVoidMethod() CallStaticIntMethod()...

Přístup k atributům obdobně jako k metodám fid = (*env)->getstaticfieldid(env, cls, "si", "I"); fid = (*env)->getfieldid(env, cls, "s", "Ljava/lang/ String;"); si = (*env)->getstaticintfield(env, cls, fid); jstr = (*env)->getobjectfield(env, obj, fid); SetObjectField SetStaticIntField...

Ošetření výjimek jmethodid mid =...... (*env)->callvoidmethod(env, obj, mid); jthroable exc = (*env)->exceptionoccurred(env); if (exc) { (*env)->exceptiondescribe(env); (*env)->exceptionclear(env);... }

Podpora synchronizace... (*env)->monitorenter(env, obj); synchronizovaný blok (*env)->monitorexit(env, obj);... wait() a notify() nejsou přímo podporovány lze je ale zavolat jako každou jinou metodu

C++ C jstring jstr = (*env)->getobjectarrayelement (env, arr, i); C++ jstring jstr = (jstring) env->getobjectarrayelement (arr, i);

JAVA JNA (Java Native Access)

Přehled není součást JDK https://github.com/java-native-access/jna automatické mapování mezi Javou a nativními knihovnami podpora pro všechny platformy není potřeba psát ručně žádný nativní kód interně používá JNI

JNA Hello world import com.sun.jna.library; import com.sun.jna.native; public interface JNAApiInterface extends Library { JNAApiInterface INSTANCE = (JNAApiInterface) Native.loadLibrary((Platform.isWindows()? "msvcrt" : "c"), JNAApiInterface.class); } void printf(string format, Object... args); public static void main(string args[]) { JNAApiInterface jnalib = JNAApiInterface.INSTANCE; jnalib.printf("hello World"); }

Mapování typů Native Type Size Java Type char 8-bit integer byte short 16-bit integer short w char_t 16/32-bit character char int 32-bit integer int int boolean value boolean long 32/64-bit integer NativeLong long long 64-bit integer long float 32-bit FP float double 64-bit FP double char* C string String void* pointer Pointer

Mapování typů pole (ukazatel) pole struct extends Structure předávání parametrů referencí char **bufp PointerByReference bufp int* lenp IntByReference lenp JNAerator https://code.google.com/archive/p/jnaerator/ generování hlaviček Java metod

Java, letní semestr Verze prezentace 2018 AJ03.cz.2018.01 Tato prezentace podléhá licenci Creative Commons Uveďte autora-neužívejte komerčně 4.0 Mezinárodní License. 46