[JAVA] Ich habe versucht, automatisch eine Klasse zu generieren, um sie mit APT von einer Datenklasse in ein Bundle zu konvertieren

Hintergrund

Es ist schwierig, Daten in Bundle festzulegen ... Besonders die Definition der Schlüsselzeichenfolge ist sehr mühsam ... Um ehrlich zu sein, nerven Serialize und Parcelable ...

Insbesondere sieht es so aus ↓ ↓ ↓ Arbeit ... Es ist ärgerlich ...

Arbeiten Sie daran, Werte in Bundle zu packen


final Bundle args = new Bundle();
args.putInt("key_id", value.getId());
args.putString("key_tag", value.getTag());
args.putBoolean("key_enabled", value.isEnabled());

Fragment von Werten aus Bundle


final Bundle args = getArguments();
final int id = args.getInt("key_id");
final String tag = args.getString("key_tag");
final boolean isEnabled = args.getBoolean("key_enabled");

Was du machen willst

Ich möchte automatisch eine Klasse erstellen, die einen Wert aus einem Bundle abrufen kann, der ihn in ein Bundle ändert, indem einfach eine Anmerkung wie AutoValue hinzugefügt wird. Insbesondere möchte ich das "Annotation Processsing Tool" verwenden, um automatisch eine Klasse zu generieren, die die folgenden Anforderungen erfüllt.

--Automatische Klasse wird beim Erstellen generiert, indem der Wert, den Sie in der Datenklasse speichern möchten, mit Anmerkungen versehen wird

Implementierungsbild

Eine automatische Klasse wird beim Erstellen generiert, indem der Wert, den Sie in der Datenklasse speichern möchten, mit Anmerkungen versehen wird

Probe (Modellklasse)


@BundleGenerator //Geben Sie die Klasse an
public class Sample {
 
    private final int mId;
 
    public Sample(int id) {
        mId = id;
    }
 
    @BundleSet //Geben Sie einen Wert an
    public int getId() { return mId; }
}

Die folgenden Klassen werden automatisch vom Build generiert.

SampleBundleGenerator (automatisch generierte Klasse)


//Name der Datenklasse+Wird automatisch von BundleGenerator generiert
public class SampleBundleGenerator {
    //Methode zum Konvertieren des Modells in ein Bundle
    @NonNull
    public static Bundle bundle(@NonNull Sample target) {
        return bundle(target, new Bundle());
    }
  
    @NonNull
    public static Bundle bundle(@NonNull Sample target, @NonNull Bundle bundle) {
        bundle.putInt("xxx.xxx.Sample_getId", target.getId());
        return bundle;
    }
 
    //Methode zum Abrufen des Werts aus dem Bundle
    @NonNull
    public static Wrapper restore(@NonNull Bundle bundle) {
        return new Wrapper(bundle);
    }
 
    public static class Wrapper {
        final Bundle mBundle;
 
        BundleWrapper(@NonNull Bundle bundle) {
            mBundle = bundle;
        }
 
        public int getId() {
            return mBundle.getInt("xxx.xxx.Sample_getId");
        }
    }
}

Wenn Sie die Datenklasse an die automatisch generierte Klasse übergeben, wird sie in Bundle konvertiert.

Daten im Bundle einstellen


Bundle bundle = SampleBundleGenerator.bundle(value);

Wenn Sie das konvertierte Bundle erneut an die automatisch generierte Klasse übergeben, können Sie den Wert der ursprünglichen Modellklasse abrufen.

Werte aus dem Bundle abrufen


SampleBundleGenerator.Wrapper sample = SampleBundleGenerator.restore(getArguments());

Ergebnisse

Klicken Sie hier, um das Ergebnis der vorläufigen Implementierung anzuzeigen → github: BundleGenerator

APT-Implementierungsmethode

Details werden in anderen Artikeln veröffentlicht, sodass nur der allgemeine Ablauf vorgestellt wird.

(1) Erstellen Sie ein neues Projekt mit Android Studio (wie beim normalen Erstellen einer App).

(2) "Java-Bibliothek" in einem neuen Modul hinzugefügt (es ist leicht zu verstehen, ob der Modulname Prozessor ist)

(3) Erstellen Sie eine Klasse, die AbstractProcessor auf der Bibliotheksseite erbt, und eine Klasse von Anmerkungen, die Sie verwenden möchten (suchen Sie in der Processor-Klasse das Element, das zur Kompilierungszeit mit Anmerkungen versehen wurde, und generieren Sie automatisch die Klasse, die Sie realisieren möchten).

@SupportedAnnotationTypes({
    "abj.bundlegenerator.processor.BundleGenerator",
    "abj.bundlegenerator.processor.BundleSet"})
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class BundleGeneratorProcessor extends AbstractProcessor {
 
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        //Generieren Sie hier eine Klasse
        //Extrahieren Sie aus dem Argument roundEnv das Element, das der gewünschten Anmerkung entspricht, und verwenden Sie diese Informationen, um eine Klasse zu generieren.
        //Das Erstellen von Klassen ist mit einer Bibliothek namens JavaPoet sehr einfach
    }
}

(4) Definieren Sie den Einstiegspunkt des Prozessors, damit Javac angeschlossen werden kann. Erstellen Sie unten eine Datei mit dem Namen javax.annotation.processing.Processor und beschreiben Sie den Klassennamen des erstellten Annotationsprozessors (abj.bundlegenerator.processor.BundleGeneratorProcessor oben). metainf.png

(5) Definieren Sie die Bibliothek auf der Modulseite, die Sie verwenden möchten

build.gradle


dependencies {
    implementation project(':processor')
    annotationProcessor project(':processor')
}

Referenz

https://qiita.com/LyricalMaestro0/items/9a4e3ec3ea7bda9ee523 https://qiita.com/opengl-8080/items/beda51fe4f23750c33e9 https://qiita.com/shiraji/items/ed674c5883ed0520791b

Recommended Posts

Ich habe versucht, automatisch eine Klasse zu generieren, um sie mit APT von einer Datenklasse in ein Bundle zu konvertieren
Ich habe versucht, eine C-Sprachprogrammquelle aus cURL zu generieren
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, mit Spring Data JPA zu beginnen
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, mit Docker eine Padrino-Entwicklungsumgebung zu erstellen
Ich habe versucht, mit Rails eine Gruppenfunktion (Bulletin Board) zu erstellen
Ich habe versucht, die Ergebnisse vor und nach der Date-Klasse mit einer geraden Zahl auszudrücken
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
[Für Anfänger] Ich möchte mit einem Auswahlbefehl automatisch vorregistrierte Daten in das Eingabeformular eingeben.
Ich habe versucht, mit Web Assembly zu beginnen
[iOS] Ich habe versucht, mit Swift eine insta-ähnliche Verarbeitungsanwendung zu erstellen
Ich habe versucht, eine Web-API zu erstellen, die mit Quarkus eine Verbindung zur Datenbank herstellt
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe versucht, ein Portfolio mit AWS, Docker, CircleCI, Laravel [mit Referenzlink] zu erstellen.
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
Ich habe versucht, mit Javafx ein einfaches Spiel zu machen ① "Lass uns Glücksspiel finden" (unvollendet)
[Java] Ich habe versucht, über den Verbindungspool eine Verbindung mit Servlet (Tomcat) & MySQL & Java herzustellen
[Android] Ich habe mit ListView + Bottom Sheet einen Materiallistenbildschirm erstellt
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen
In dieser Zeit habe ich versucht, Java Bean und XML mit dem Jackson-Formatierer XML zu konvertieren
Verwandeln Sie sich von einer normalen Klasse in einen Lambda-Stil
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe versucht, eine Website für das Studium von DUO3.0 zu entwickeln.
Konvertieren Sie eine Zeichenfolge mit swift in ein zeichenweises Array
Ich habe versucht, eine Java-Methode von ABCL zu verwenden
So konvertieren Sie einen Soliditätsvertrag in eine Java-Vertragsklasse
Ich habe versucht, eine LINE-Klon-App zu erstellen
Ich möchte mit Firestore von Rails spielen
Ich habe versucht, eine Website zu entwickeln, um Ausgaben zu erfassen.
Ich habe versucht, einen Server mit Netty zu implementieren
So generieren Sie automatisch einen Konstruktor in Eclipse
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
Ich habe versucht, ein einfaches Spiel mit Javafx zu machen ① "Lass uns Glücksspiel finden" (unvollendete Version ②)
Ich habe versucht, YouTube-Video von DB mit haml aufzurufen und es eingebettet anzuzeigen
[Azure] Ich habe versucht, eine kostenlose Java-App zu erstellen ~ Mit FTP verbinden ~ [Anfänger]
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
Ich möchte eine Methode einer anderen Klasse aufrufen
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, eine Ramen-Shop-Sharing-Website zu entwickeln.
Ich habe MySQL 5.7 mit Docker-Compose gestartet und versucht, eine Verbindung herzustellen
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich möchte eine bestimmte Datei mit WatchService überwachen