16
Język Java Technikalia - wstęp do inżynierii oprogramowania Wirtualna maszyna Javy, kod bajtowy Twórcy Javy przyjęli założenie, że programy w tym języku powinny móc być uruchamiane na wszystkich (większości) platform sprzętowych a równocześnie być pozbawiona wad interpretatorów – zwłaszcza związanych z wydajnością. Typowy proces kompilacji programów (np. C++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki źródłowe nie są tłumaczone na język maszynowy ale na tzn. kod bajtowy (byte code) niezależny od konkretnej platfomy sprzętowej, które potem są wykonywane przez wirtualną maszynę javy (JVM)

andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

Embed Size (px)

Citation preview

Page 1: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

Język Java

Technikalia - wstęp do inżynierii oprogramowania

Wirtualna maszyna Javy, kod bajtowy

Twórcy Javy przyjęli założenie, że programy w tym języku powinny móc być uruchamiane na wszystkich (większości) platform sprzętowych a równocześnie być pozbawiona wad interpretatorów – zwłaszcza związanych z wydajnością.

Typowy proces kompilacji programów (np. C++) można przedstawić w postaci diagramu:

Natomiast w przypadku Javy pliki źródłowe nie są tłumaczone na język maszynowy ale na tzn. kod bajtowy (byte code) niezależny od konkretnej platfomy sprzętowej, które potem są wykonywane przez wirtualną maszynę javy (JVM)

Page 2: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

.

64 a 32 bity

Programy w kodzie bajtowym są niezależne od długości słowa maszynowego, więc powinny być uruchamiane zarówno na JVM 32 jak i 64 bitowej (i każdej innej(. Niektóre jednak biblioteki javy , takie jak SWT naruszają w pewien sposób zasadę niezależności od platformy sprzętowej poprzez połączenie z natywnymi bibliotekami graficznymi czy innymi (w tym przypadku spowodowane jest to

Page 3: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

przyjętym w bibliotece SWT założeniem maksymalnego podobieństwa do oryginalnych komponentów graficznych systemu i wykorzystania natywnych GUI). W przypadku takich bibliotek występują wersję 32- i 64 –bitowe, które dają się uruchomić na odpowiednich wersjach JVM

JDK,JRE

Do uruchomienia programów javy niezbędny jest nadzór wirtualnej maszyny javy. Może być ona zainstalowana w jednym dwóch większych środowisk: Java Runtime Environment (środowisko do uruchamiania apletów javy) i Java Develepment Kit umożliwiają również kompilację plików źródłowych javy do kodu bajtowego.

Parametry JVM

- agentlib:libname[=options] załadowanie natywnej biblioteki (typu agenta)-agentpath:pathname[=options]-client-Dproperty=value Ustalenie właściwości (property) systemowej-disableassertions[:[packagename]...|:classname]-da[:[packagename]...|:classname]-disablesystemassertions-dsa-enableassertions[:[packagename]...|:classname]-ea[:[packagename]...|:classname]-enablesystemassertions-esa-help – wyświetlenie pomocy-?-jar filename

Wykonanie programu zawarteg w archiwum typu jar . W takim archiwum musi istnieć plik manifest zawierający Main-Class:classname definujący klasę zawierającą metodę public static void main(String[] args) służącą jako punkt startowy aplikacji

When you use the -jar option, the specified JAR file is the source of all user classes, and other class path settings are ignored.

http://docs.oracle.com/javase/8/docs/technotes/guides/jar/index.html

http://docs.oracle.com/javase/tutorial/deployment/jar/index.html

-javaagent:jarpath[=options]-jre-restrict-search-no-jre-restrict-search-server

http://docs.oracle.com/javase/8/docs/technotes/guides/vm/server-class.html

-showversiondisplaying version information.

-splash:imgname – wyświetlenie obrakza na starcie aplikacji (splash screen)-splash:images/splash.gif

-verbose:class

Page 4: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

-verbose:gc – szczegółowe informacje o Garbage Collector-ze-verbose:jni-version-version:release – wyświetlenie wersji / szcegółów wersji-Xbatch-Xbootclasspath:path-Xbootclasspath/a:path-Xbootclasspath/p:path-Xcheck:jni-Xcomp-Xdebug-Xdiag-Xfuture-Xint-Xinternalversion-Xmsvalue - minimalny rozmiar sterty

-Xmxvalue – maksymalny rozmiar sterty

-XX:MinHeapFreeRatio=minimum

-XX:MaxHeapFreeRatio=maximum

-XX:NewRatio=ratio

-XX:NewSize=size

-XX:MaxNewSize=size

-XX:+AggressiveHeap

Środowisko uruchomieniowe w eclipsie

Page 5: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki
Page 6: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki
Page 7: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

Kompilacja, uruchamianie

Aby skompilować program javy (*.java) do postaci kodu bajtowego należy użyć polecenia javac dostępnego w JDK. Wygenerowany zostaje plik *.class, który może być uruchomiony w dowolnym systemie operacyjnym z JVM. Uruchomienie pliku *.class odbywa się poprzez polecenia java nazwa_pliku_bez_rozszerzenia

Błędy javy – stos wywołań

Exception in thread "main" org.eclipse.swt.SWTException: Widget is disposedat org.eclipse.swt.SWT.error(Unknown Source)at org.eclipse.swt.SWT.error(Unknown Source)at org.eclipse.swt.SWT.error(Unknown Source)at org.eclipse.swt.widgets.Widget.error(Unknown Source)at org.eclipse.swt.widgets.Widget.checkWidget(Unknown Source)at org.eclipse.swt.widgets.Table.getItemCount(Unknown Source)at org.eclipse.swt.widgets.TableItem.<init>(Unknown Source)at po_w2.TableAndSubForm$1.widgetSelected(TableAndSubForm.java:94)at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)at po_w2.TableAndSubForm.initGui(TableAndSubForm.java:124)at po_w2.Wyklad2.main(Wyklad2.java:9)

Page 8: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

Ślad stosu wywołań w eclipsie jest KLIKALNY co bardzo przydaję się przy znajdowaniu błędów, co więcej możemy w konsoli Java Stack wkleić ślad stosu wywołań (np. z logów) i będzie również klikalny

Pakiety

Kod javy przy więcej niż jednej klasie (a zazwyczaj aplikacje w tym języku zawierają zdecydowanie więcej) powinien być podzielony pakiet. Klasy z tego samego pakietu znajdują się fizycznie w tym samym folderze, nazwa folderu (scieąki dostępu) powinna być taka nazwa pakietu a nazwa klasy taka jak nazwa pliku *.java. Proszę zwrócić uwagę, że przy kompilacji klas z różnych pakietów trzeba albo zmieniać katalogi i kompilować w katalogu, w którym znajduje się pliki *.java albo kompilować z poziomu nadrzędnego z opcją –d np.

javac com/net/pwr/pakiet1/MojaKlasa.java –d com/net/pwr/pakiet1/

Metoda main(String[] args])

Metoda, od której zaczyna się uruchamianie aplikacji, jako argument do niej przekazywana jest lista argumentów programu podanych w wierszu poleceń lub odpowiednim oknie konfiguracji uruchomienia w eclipse.

public class Message {

public static void main (String [] args) {

System.out.println("Witaj w nowym semestrze "+(args.length>0?args[0]:"")) ;

}

}

Witaj w nowym semestrze Andrzeju

Page 9: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

Wiersz poleceń / zmienne systemowe w eclipsie

import java.util.Map;

public class EnvMap {

public static void main (String[] args) {

Map<String, String> env = System.getenv();

System.out.println("Zmienna systemowa path: "+env.get("Path"));

}

}

Metoda main – prawidłowo

Metoda main jest metodą statyczną, co wiąże się z koniecznością stosowania w niej tylko zmiennych i metod statycznych, co stoi w sprzeczności z założeniami programowania obiektowego

Dobrym zwyczajem jest więc ograniczenie metody main np. postaci takiej konstrukcji

Page 10: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

package jp_w2;

public class A {

public static void main(String[] args) {

A a=new A();

A.init();

}

private void init(){

// Tu tworzymy kod, który nie musi być już statyczny

}

}

Konstrukcja na pierwszy rzut oka może wydawać się dziwna, jednak jest to standardowa metoda tworzenia instancji obiektu zawierającego klasę main (zwróćmy uwagę, że w programie jest utworzona tylko jedna instancja klasy A, bo metoda statyczne

Biblioteki , classPath, Ant, Maven, Gradle

Kompilowanie i uruchamianie programu składającego się z wielu pakietów i z dołączonymi różnymi biblioteki jest zadaniem bardzo pracochłonnym. Powstały więc nakładki pomagające w kompilacji, uruchamianiu a nawet dołączaniu bibliotek i wielu czynnościach pomocniczych.

ANT

<?xml version="1.0" encoding="UTF-8" standalone="no"?><project default="create_run_jar" name="Create Runnable Jar for Project STS4Client with libraries in sub-folder"> <!--this file was created by Eclipse Runnable JAR Export Wizard--> <!--ANT 1.7 is required --> <target name="create_run_jar"> <jar destfile="C:/andrzej/Projekty/Sicontrol/Produkcja/sts4.jar"> <manifest> <attribute name="Main-Class" value="ditari.uibase.LoginComposite"/> <attribute name="Class-Path" value=". sts4_lib/commons-digester-1.7.jar sts4_lib/odfdom-java-0.8.7.jar sts4_lib/resolver.jar sts4_lib/xercesImpl.jar sts4_lib/xml-apis.jar sts4_lib/quartz.jar sts4_lib/jboss-jca.jar sts4_lib/scheduler-plugin.jar sts4_lib/jboss-aop-client.jar sts4_lib/trove.jar sts4_lib/jboss-ejb3-metadata.jar sts4_lib/jboss-mdr.jar ….sts4_lib/metadata-extractor-2.6.4.jar sts4_lib/xmpcore.jar sts4_lib/opal-0.9.5.2.jar" /> <attribute name="Created-By" value="Ditari Sp. z o.o."/> <attribute name="Specification-Version" value="4.078"/> <attribute name="Implementation-Version" value="4.078"/> </manifest> <fileset dir="C:/usr/workspace-apic/STS4Client/bin"/> <fileset dir="C:/usr/workspace-apic/JEPLite/bin"/> <fileset dir="C:/usr/workspace-apic/STS4Server/build/classes"/> </jar> </target></project>

Page 11: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

MAVEN

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion> <parent> <groupId>com.net.clinic.seam</groupId> <artifactId>seam-netclinic</artifactId> <version>1.0</version> <relativePath>../pom.xml</relativePath> </parent>

<artifactId>seam-netclinic-war</artifactId> <!-- m2eclipse does not like: ${app.context}-war --> <name>${project.artifactId} : ${project.version}</name> <description>The Seam Maven reference implementation WAR module</description> <packaging>war</packaging>

<profiles> <!-- More than one profile can be active at once. Since profiles can contain the same types of configuration there can be clashes. If two profiles clash the last to be activated will override those activated earlier. Note: "mvn install -Penv-dev" deactivates activeByDefault --> <profile> <id>env-dev</id> <activation> <property> <name>env</name> <value>dev</value> </property> </activation> <properties> <env>dev</env> </properties> </profile>

……….. </profiles>

<dependencies>

<dependency> <groupId>net.sourceforge.barbecue</groupId> <artifactId>barbecue</artifactId> <version>1.5-beta1</version> </dependency>

<dependency>

Page 12: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

<groupId>org.swinglabs</groupId> <artifactId>pdf-renderer</artifactId> <version>1.0.5</version> </dependency>

<!-- seam --> <dependency> <groupId>org.jboss.seam</groupId> <artifactId>jboss-seam-ui</artifactId> </dependency>

………………

<dependency> <groupId>org.richfaces.samples</groupId> <artifactId>darkX</artifactId> </dependency>

<dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <scope>provided</scope> </dependency>

<!-- <dependency>--> <!-- <groupId>org.jenia4faces</groupId>--> <!-- <artifactId>jenia4faces</artifactId>--> <!-- <scope>provided</scope>--> <!-- </dependency>-->

<!-- jee --> <dependency> <groupId>com.sun.facelets</groupId> <artifactId>jsf-facelets</artifactId> <scope>provided</scope> </dependency>

<!-- <dependency>--><!-- <groupId>com.lowagie</groupId>--><!-- <artifactId>itext</artifactId>--><!-- <version>2.1.5</version>--><!-- </dependency>-->

</dependencies>

<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <executions> <execution> <configuration> <files> <file>../src/main/filters/filter-${env}.properties</file> <!-- does not work with mvn eclipse:m2eclipse <file>${project.parent.basedir}/src/main/filters/filter-${env}.properties</file> -->

Page 13: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

</files> </configuration> </execution> </executions>… </plugins> </build>

</project>

ZAD 1. Pobierz i zainstaluj Java JDK

Przygotuj w pliku Message.java edytorze program:

public class Message {

public static void main (String [] args) {

System.out.println("Witaj w nowym semestrze "+(args.length>0?args[0]:"")) ;

}

}

Skompiluj program do postaci bajtowej (*.class)

"c:\Program Files\Java\jdk1.7.0_75z\bin\javac.exe" Message.java

Uruchom program, zwróć uwagę na parametr ClassPath (cp) informujący, że pliki *.class należy szukać w bieżącym katalogu

>"c:\Program Files\Java\jdk1.7.0_75z\bin\java.exe" -cp . Message andrzej

Witaj w nowym semestrze andrzej

ZAD 2. Umieść program z p. 1 w pakiecie jezyki.programowania.lab1, wymaga to trzech zmian: (1 pkt)

Umieszczenia pliku w podfolderze jezyki\programowania\lab1

dodania definicji pakietu w pierwszej linii kodu:

package jezyki.programowania.lab1;

dodania nazwy pakiety przy uruchomieniu kodu bajtowego

>"c:\Program Files\Java\jdk1.7.0_75z\bin\java.exe" –cp .jezyki.programowania.lab1.Message andrzej

Witaj w nowym semestrze andrzej

ZAD 3. Stwórz wersję graficzną programu (wpisujemy w odpowiednie pole imię naciskamy przycisk i otrzymujemy komunikat Witaj w nowym semestrze imię), Będzie to wymagało dodania biblioteki SWT do ClassPath, co osiągamy poprzez zmianę parametru cp na –cp .;swt.jar :

import org.eclipse.swt.SWT;

import org.eclipse.swt.events.SelectionAdapter;

Page 14: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

import org.eclipse.swt.events.SelectionEvent;

import org.eclipse.swt.graphics.Color;

import org.eclipse.swt.layout.GridData;

import org.eclipse.swt.layout.GridLayout;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Label;

import org.eclipse.swt.widgets.MessageBox;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Text;

public class MessageSWT {

private static Text name;

public static void main (String [] args) {

Display display = new Display ();

final Shell shell = new Shell(display);

shell.setLayout(new GridLayout(1, false));

shell.setSize(400,200);

Label l= new Label(shell, SWT.NONE);

l.setText("Podaj imię");

name = new Text(shell, SWT.NONE);

Button b= new Button(shell, SWT.BORDER);

b.setText("Przywitaj mnie");

GridData gdButton =new GridData();

gdButton.horizontalAlignment=SWT.CENTER;

b.setLayoutData(gdButton);

b.addSelectionListener(new SelectionAdapter() {

@Override

public void widgetSelected(SelectionEvent arg0) {

MessageBox mb =new MessageBox(shell);

mb.setMessage("Witaj w nowym semestrze"+MessageSWT.name.getText());

mb.open();

}

});

shell.open ();

Page 15: andrzej.ae.jgora.plandrzej.ae.jgora.pl/materialy/obiektowe/Język java - technikalia.docx · Web viewC++) można przedstawić w postaci diagramu: Natomiast w przypadku Javy pliki

shell.layout();

while (!shell.isDisposed ()) {

if (!display.readAndDispatch ()) display.sleep ();

}

display.dispose ();

}

}