Generierte Quellen lesen

Klassennamenzuordnung

Da J2ObjC nur Java-Klassen übersetzt, die nicht auf der Benutzeroberfläche basieren, muss eine iOS-Anwendung direkt mit den übersetzten Klassen funktionieren. Übersetzte Klassen sind reguläre NSObject-gerootete Objective-C-Klassen. Es ist jedoch hilfreich, um zu verstehen, wie Klassen-, Methoden-, Parameter- und Header-Dateinamen konvertiert werden.

Java verwendet Pakete, um Namespaces zu definieren. Objective-C hat keine Pakete und hat stattdessen eine Konvention, ein gemeinsames Präfix vor ähnlichen Klassen wie NSObject und NSString zu platzieren. Zum Beibehalten von Java-Namespaces werden Paketnamen einem Präfix mit Camel-Case-Schreibweise zugeordnet. Beispielsweise ist java.util.List standardmäßig JavaUtilList zugeordnet. Dieses Standardpräfix kann explizit mit den Paketpräfixoptionen von j2objc festgelegt werden.

Parameternamen

Java unterscheidet zwischen überlasteten Methoden durch ihre Argumenttypen, während Objective-C Argumentnamen verwendet. J2ObjC erstellt daher Argumentnamen aus deren Typen. So wird beispielsweise ein Objekt am Anfang eines ArrayList eingefügt und diese Liste dann einer anderen Liste hinzugefügt:

[someList addWithInt:0 withId:object];
[otherList addAllWithJavaUtilCollection:somelist];

Jeder Argumentname besteht aus „with“ plus seinem Typ. Das ist etwas hässlich, sorgt aber dafür, dass in Objective-C immer dieselbe Methode aufgerufen wird wie in Java.

Headernamen

Die Namen von Header-Dateien werden jedoch nicht zugeordnet. Stattdessen wird der Java-Quelldateipfad mit „.h“ statt „.java“ enden. Dies erleichtert die Unterstützung von Tools wie Xcode und Make, kann jedoch anfangs etwas verwirrend sein, da:

#import "java/util/Date.h"

Die JavaUtilDate-Klasse wird deklariert, nicht die Date.

Übersetzte Klassen verwenden

Neben den ungeraden Namen, die mit Paketpräfixen vereinfacht werden können, werden übersetzte Klassen wie alle anderen Objective-C-Klassen verwendet:

#import "java/util/BitSet.h"
...
  JavaUtilBitSet *bitset = [[JavaUtilBitSet alloc] init];
  [bitset setWithInt:10 withBOOL:YES];
  BOOL b = [bitset getWithInt:10];