Diesmal ist es Reflexion mit Anmerkungen. Feldanmerkungen sind nützlich, wenn ein Feld einige Attribute haben soll, Sie es aber nicht in Ihre Geschäftslogik schreiben möchten.
Die, die ich letztes Mal gemacht habe → Dienstprogramm, um das Feld des Objekts mit einem geeigneten Wert zu füllen
Dieses Mal habe ich eine Util-Methode erstellt, die ein Entity-Objekt in horizontal konvertiert (1 CSV-Datensatz).
--Datenanmerkung --AnnotationUtil Klasse --Benutzerklasse --Hauptklasse
AnnotationUtil Geben Sie die Kopfzeile mit der Methode getHeader aus. Geben Sie eine Datenzeile mit der Methode getData aus.
AnnotationUtil.java
package test1;
import java.lang.reflect.Field;
public class AnnotationUtil {
/**Komma*/
private static final String DELIMITER = ",";
/**Doppeltes Zitat*/
private static final String QUOTE = "\"";
/**
*Benutzer in CSV1-Zeile konvertieren.<br>
*Benutzer hat@Gibt das Feld mit Daten als eine CSV-Zeile zurück.<br>
* isHeader=Wenn true, wird der Titel im angegebenen CSV-Format zurückgegeben.
*/
public static String getUser(User obj, boolean isHeader, String delimiter, String quote) {
Field[] fieldList = obj.getClass().getDeclaredFields();
StringBuilder sb = new StringBuilder();
for (Field f : fieldList) {
f.setAccessible(true);
Data annotation = f.getAnnotation(Data.class);
if (annotation == null) {
continue;
}
String value;
try {
if (isHeader) {
value = annotation.title(); //Titel
} else {
value = String.valueOf(f.get(obj)); //Wert
}
} catch (IllegalArgumentException | IllegalAccessException e) {
//Da die Throws-Deklaration problematisch ist, machen Sie zur Laufzeit alle Ausnahmen
throw new RuntimeException(e);
}
//Wenn das Boxzeichen angegeben ist
if (quote != null)
sb.append(quote);
//Wert oder Artikelname
sb.append(value);
//Wenn das Boxzeichen angegeben ist
if (quote != null)
sb.append(quote);
//Trennzeichen
sb.append(delimiter);
}
//Entfernen Sie das letzte Trennzeichen
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
public static String getHeader(User user) {
return getUser(user, true, DELIMITER, QUOTE);
}
public static String getData(User user) {
return getUser(user, false, DELIMITER, QUOTE);
}
}
Data Fügen Sie diese Anmerkung dem Feld hinzu, das als CSV-Daten ausgegeben werden soll. Geben Sie den Headernamen mit dem Titel an.
Data.java
package test1;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Target(FIELD)
@Retention(RUNTIME)
public @interface Data {
String title();
}
User Entitätsklasse. Fügen Sie dem Feld, das Sie ausgeben möchten, eine Datenanmerkung hinzu.
User.java
package test1;
public class User {
@Data(title = "Mitarbeiter-ID")
public Integer id;
@Data(title = "Name")
public String name;
public String insertDate;
public String insertUser;
public String updateDate;
public String updateUser;
}
Main Zur Überprüfung des Betriebs des Dienstprogramms.
Main.java
package test1;
public class Main {
public static void main(String[] args) {
System.out.println("### Start ###");
User user = new User();
user.id = 101;
user.name = "Albert";
user.insertDate = "20190501";
user.insertUser = "Chris";
user.updateDate = "20190512";
user.updateUser = "Jill";
System.out.println(AnnotationUtil.getHeader(user));
System.out.println(AnnotationUtil.getData(user));
System.out.println("### End ###");
}
}
python
### Start ###
"Mitarbeiter-ID","Name"
"101","Albert"
### End ###
Es wurde von vertikal nach horizontal konvertiert. Da Daten nur zu ID und Name hinzugefügt werden, werden nur diese beiden ordnungsgemäß ausgegeben.
Als ich es zum ersten Mal seit einiger Zeit ohne Verwendung der IDE implementierte, wurden die Rückgabewerte von Feld # getAnnotation () aus irgendeinem Grund alle NULL. Es hat gut funktioniert, als ich die IDE verwendet habe, aber warum? ??
Recommended Posts