Java Snippets
Kleine Code Snipptes für Java.
Contents
Zentrieren von Text in einem Bild
Benötigte Funktion ist getStringBounds von der Klasse FontMetrics.
BufferedImage image = createBufferedImage();
double height = (double) image.getHeight();
double width = (double) image.getWidth();
String toCenter = "Hello World";
Graphics2D g = image.createGraphics();
FontMetrics metrics = g.getFontMetrics();
Rectancle2D rect = metrics.getStringBounds(toCenter, g);
double x = width/2.0d - rect.getWidth()/2.0d;
double y = height/2.0d - rect.getHeight()/2.0d;
g.drawString((int) x, (int) y,toCenter);
Multidimensionale Arrays
Arrays koennen in Java ugly definiert werden. a1, a2, a3 und a4 sind alles 3-d Arrays vom selben Typ.
public static void main(String[] args) {
int[][][] a1 = new int[3][3][3];
int[][]a2[] = new int[3][3][3];
int[]a3[][] = new int[3][3][3];
int a4[][][] = new int[3][3][3];
a1[0][0][0] = 2;
a2[0][0][0] = 2;
a3[0][0][0] = 2;
a4[0][0][0] = 2;
System.out.println(a1[0][0][0]);
System.out.println(a2[0][0][0]);
System.out.println(a3[0][0][0]);
System.out.println(a4[0][0][0]);
}
Druckt 2222
Array Initialization:
Object array = new int[][] {{2,4}, {2}, {1,5,3}};
int[][] casted = (int[][]) array;
for(int x=0; x< casted.length; x++){
for(int y=0; y<casted[x].length; y++){
int value = casted[x][y];
System.out.println("x:" + x + " y:" + y + " value:" + value);
}
}
//int notdefined = casted[0][2]; Index out of bounds exception
//System.out.println(notdefined);
//Here another way to initialize an empty array
int a5[][][] = {{{}}};
printf
Analog zu C's printf. public PrintStream printf(String format, Object... args)
.
Der String format kann folgende Fragmente enthalten: %[argument_index$][flags][width][.precision]conversion
.
Flags kann folgende Werte aufweisen (nicht abschliessend)
- f Floating point, dezimale Zahl
- t Datum
- x Hexadezimal Integer
- b Druckt true oder false, je nachdem, ob Input null oder nicht null ist.
- d ganze Zahl
- s toString() wird aufgerufen.
Beispiele:
public static void main(String[] args) {
System.out.printf("Hello World %b",null); //Prints "Hello World false";
System.out.printf("Hello %f", 0.3f); //Hello 0.300000
System.out.printf("Current hour %tH", System.currentTimeMillis()); //Current hour "10" (in my case)
System.out.printf("%2$d %3$d",3,4,5); // Prints "4 5"
}
Calendar
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
int hourNow = calendar.get(Calendar.HOUR_OF_DAY);
System.out.println(hourNow);
//Add 12 hours
calendar.add(Calendar.HOUR, 12);
int hourIn12H = calendar.get(Calendar.HOUR_OF_DAY);
System.out.println(hourIn12H);
}
Class in Method
public class Main {
public interface I {public void print();}
public class A {
public void print(){System.out.println("Class in Class");}
}
public static void main(String[] args) throws InterruptedException {
System.out.println(Runtime.getRuntime().availableProcessors());
class A implements I {
public void print(){System.out.println("Class in Method");}
}
I i = new A();
i.print(); //Prints class in Method
}
}
Assertions
Assertions sind defaultmaessig disabled. Mit dem VM argument -ea oder -enableassertions kann man sie einschalten.
public void xy(int x){
assert x > 0; //Einfache Form
assert x > 0 : "Das Argument x muss > 0 sein"; //Komplexere Form
}
Schlaegt eine Assertion fehl, dann wird ein java.lang.AssertionError
geworfen.
Generics, Provider
class A<T> {
T n;
public A(T obj){
n = obj;
}
public T getObj(){return n;}
public static void aMethod(){
A<Integer> u = new A("abc");
u.getObj();
Integer x = u.getObj(); //This very line will throw a ClassCastException
}
}
Generics, Client, Key Concepts
Unterschied zu C# siehe jprl
public class Main {
public static void main(String[] args) {
List<A> a = new ArrayList<A>();
List<B> b = new ArrayList<B>();
List<Object> c = new ArrayList<Object>();
m1(a);
m2(a);
m3(a);
m1(b);
//m2(b); will not compile
//m3(b); will not compile
//m1(c); will not compile
m2(c);
//m3(c); will not compile
}
private static void m1(List<? extends A> m){}
private static void m2(List<? super A> m){}
private static void m3(List<A> m){}
}
class A {}
class B extends A {}
Anbei ein weiteres Beispiel mit einem Interface:
public class Main {
public static void main(String[] args) {
List<X> d = new ArrayList<X>();
List<C> e = new ArrayList<C>();
m4(d);
m5(d);
//m4(e); will not compile
m5(d);
}
private static void m4(List<X> m){}
private static void m5(List<? extends X> m){}
}
class A {}
class B extends A {}
class C implements X {}
interface X {}
Weiteres Key-Konzept:
public class Main {
public static void main(String[] args) {
List<A> a = new ArrayList<A>();
List<? extends A> b;
b = a;
a.add(new A());
//b.add(new B()); Will not compile
b.add(null); //compiles, null allowed
}
}
class A {}
public class Main {
public static void main(String[] args) {
ArrayList x = new ArrayList();
m8(x); //Compiles with warning
}
public static void m8(ArrayList<String> x){}
}
enum
Enum mit Funktionen und Membervariablen:
enum MyEnum {ABC, DEF ;
public String info(){return "abc";}
public String more(){return "more";}
int q;
}
Etwas komplexeres Beispiel:
public class Demo1 {
public static void main(String[] args){
System.out.println(MyEnum.A.info());
System.out.println(MyEnum.C.info());
}
}
enum MyEnum {
A {String info(){return "A";}},
B {String info(){return "B";}},
C;
String info(){return "default";}
}
classpath
Der Classpath kann entweder mit der Option -cp (auch -classpath) bei java und javac angegeben, oder in der Shellvariable CLASSPATH gespeichert werden. Mehrere Eintraege werden mit dem Semicolon getrennt.
java -cp jarx.jar;.;jary.jar
Jar Dateien muessen einzeln angegeben werden, folgendes geht nicht:
java -cp *.jar //Geht nicht!!!
Siehe classpath
Objekte serialisieren und deserialisieren
Serialisieren:
public static void serialize(Object obj){
FileOutputStream fos = null;
try {
File file = new File("ser.dat");
fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
} catch (IOException ex) {
throw new RuntimeException(ex);
} finally {
try {
fos.close();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
Deserialisieren:
public static Object deSerialize() {
FileInputStream fis = null;
Object result = null;
{
ObjectInputStream ois = null;
try {
File file = new File("ser.dat");
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
result = (Main) ois.readObject();
return (Main) result;
} catch (IOException ex) {
throw new RuntimeException(ex);
} catch (ClassNotFoundException ex) {
throw new RuntimeException(ex);
} finally {
try {
ois.close();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
}
Annotation
Definition
package sample;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
public int intProperty();
public String stringProperty();
public String stringProperty2() default "notdefined";
}
Usage:
package sample;
public class AnnotationClient {
@MyAnnotation(intProperty = 3, stringProperty="AString")
public void myMethod(){}
}
Auswerten:
@MyAnnotation(intProperty=3, stringProperty="myString")
public static void main(String[] args) {
try {
Method m = Main.class.getMethod("main", args.getClass());
MyAnnotation annot = m.getAnnotation(MyAnnotation.class);
if(annot == null){
System.out.println("Annotation not present");
return;
}
String stringValue = annot.stringProperty();
System.out.println(stringValue);
} catch (NoSuchMethodException ex) {
throw new RuntimeException(ex);
} catch (SecurityException ex) {
throw new RuntimeException(ex);
}
}
Java Primitive
Instanzieren von Inner classes
Folgendes Beispiel demonstriert Innere Classes
public class Demo1 {
public static void main(String[] args){
A.B b = new A().new B(); //Prints A B
}
}
class A {
public A(){System.out.println("A");}
class B {
public B(){System.out.println("B");}
}
}