jar
class
Datei. Bei größeren Projekten erhält man so eine Menge von Klassen auf deren Vollständigkeit man bei der Distribution zu achten hat.
Insbesondere beim Übertragen von Java-Code über eine Netzwerkverbindung (z. B. JavaApplets) müssen so viele kurze Übertragungen getätigt werden, deren overhead wesentlich höher ist als bei einer einzigen längeren Verbindung.
Um dies zu verhindern, kann man die class
Dateien in ein jar
Archiv packen. Dabei handelt es sich im Grunde um ein normales Zip-Archiv, jar
bietet aber noch zusätzliche Eigenschaften:
jar
Archive können signiert werden (siehe AppletSecurity).
META_INF/MANIFEST.MF
können zusätzliche Informationen abgelegt werden, z. B. den Namen der Klasse, die die main
Methode enthält. Eine so gepackte Applikation kann dann einfach mittels java -jar Archiv.jar
gestartet werden.
jarsigner
mit einem X.509-Schlüssel signiert werden.
Die Zuweisung von mehr Rechten ist vom Browser abhängig: appletviewer
wertet die Datei ~/.java.policy
aus, die Rechte nach Zertifikat oder nach Herkunft des Applets erlaubt, also auch unsigniert Applets privilegieren kann.
appletviewer
.
Complex
package fft; class Complex { private double real; private double img; Complex(double real, double imaginary) { this.real = real; img = imaginary; } public String toString() { return real + " + " + img + "i" ; } /* Complex.add(x, y) */ static Complex add(Complex a, Complex b) { return new Complex(a.real + b.real, a.img + b.img); } /* x.add(y) */ Complex add(Complex other) { //real = real + other.real; //img += other.img; //return this; return new Complex( real + other.real, img + other.img); } static Complex multiply(Complex x, Complex y) { return new Complex(x.real * y.real - x.img * y.img, x.real * y.img + x.img * y.real); } /* x**n */ static Complex exp(Complex x, int n) { if (n == 0) { return new Complex(1,0); } else { return Complex.multiply(x, Complex.exp(x, --n)); } } /* = cos(2pi/n) + i(sin(2pi/n)) */ static Complex getRootOfUnity(int n){ return new Complex(Math.cos(2 * Math.PI /n), Math.sin(2 * Math.PI /n)); } }-- Christo - 12 Dec 2003
package fft; class Matrix { Object[][] data; Matrix(int rows, int cols) { data = new Object[rows][cols]; } void setValue(int row, int column, Object o) { data[row][column] = o; } Object getValue(int row, int column) { return data[row][column]; } public String toString() { String result = ""; for(int i = 0; i < 4; i++) { result += "|"; for(int j = 0; j < 4; j++) { result += " (" + data[i][j] + ")"; } result += "|" + System.getProperty("line.separator"); } return result; } }-- Christo - 12 Dec 2003
EoField
("_element of field_"):
package fft; /* Abstrakte Klasse Körper, die das Vorhandensein der Grundrechenarten fordert. */ interface EoField { /* Diese Methoden lassen sich leider nicht static definieren */ public EoField add(EoField other); public EoField multiply(EoField other); }
RealNumber
package fft; class RealNumber implements EoField { private double value; public RealNumber(double value) { this.value = value; } public EoField add(EoField other) { return new RealNumber(value + ((RealNumber) other).value); } public EoField multiply(EoField other) { return new RealNumber(value * ((RealNumber) other).value); } public String toString() { return String.valueOf(value); } }
Complex
Complex
EoField
implementiert, müssen folgende Anpassungen vorgenommen werden:
package fft; class Complex implements EoField { ... public EoField add(EoField other) { return add(this, (Complex) other); } public EoField multiply(EoField other) { return multiply(this, (Complex) other); }-- Christo - 12 Dec 2003
Matrix
kann nun eine Multiplikation von Matrizen von EoField
Objekten definiert werden:
/* a[nxp] * n[pxm] = c[nxm] */ public static Matrix multiply(Matrix left, Matrix right) { int n = left.getRows(); int m = right.getColumns(); int p = left.getColumns(); Matrix result = new Matrix(n, m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { // c[i][j] = a[i][0]*b[0][j] + a[i][1] * b[1][j] ... EoField tmp = (((EoField) left.getValue(i, 0)).multiply((EoField) right.getValue(0, j))); for (int k = 1; k < p; k++) { tmp = tmp.add(((EoField) left.getValue(i, k)).multiply((EoField) right.getValue(k, j))); } result.setValue(i, j, tmp); } } return result; }-- Christo - 12 Dec 2003