So verwenden Sie Anmerkungen und Reflexion in Java
王林
Freigeben: 2023-05-10 14:04:06
nach vorne
1285 Leute haben es durchsucht
1. Anmerkung
1.1 Was ist Anmerkung
Anmerkungen sind nicht das Programm selbst und können während der Programmkompilierung, beim Laden der Klasse und zur Laufzeit gelesen werden Verarbeitung. Das Format der Annotation ist „@annotation name (Parameterwert)“, das an Pakete, Klassen, Methoden und Felder angehängt werden kann, und auf die Annotation kann über den Reflexionsmechanismus zugegriffen werden.
Diese Anmerkung zeigt an, dass die Überschreibung erfolgt ist Methoden ihrer übergeordneten Klasse, stellen Sie sicher, dass die Unterklasse tatsächlich die Methode der übergeordneten Klasse überschreibt, um Fehler auf niedriger Ebene zu vermeiden
Diese Anmerkung weist darauf hin, dass eine Eigenschaft, Methode oder Klasse veraltet ist (ein Programmelement, von dessen Verwendung Programmierern abgeraten wird, normalerweise weil es gefährlich oder besser ist). Wenn eine alternative Methode vorhanden ist, gibt der Compiler eine Warnung (durchgestrichen) aus, wenn andere Programme veraltete Eigenschaften, Methoden oder Klassen verwenden.
Die von dieser Annotation betroffenen Klassen, Methoden und Eigenschaften unterdrücken die Anzeige des Compilers Warnungen, seine Parameter dienen hauptsächlich für Warnanweisungen und Abbruch (nicht aktiviert) usw.
@SuppressWarnings("取消此类的所有警告")
public class BuiltAnnotation {
@SuppressWarnings("取消此属性的警告")
private String username;
@SuppressWarnings("取消此方法的警告")
public static void main(String[] args) {
// ...
}
}
Nach dem Login kopieren
1.3 Meta-Annotation
Die Rolle der Meta-Annotation besteht darin, andere Annotationen zu kommentieren. Java definiert 4 Standard-Meta-Annotationstypen, die Beschreibungen des Umfangs bereitstellen und Arten anderer Anmerkungen sowie andere Anmerkungen können durch Meta-Anmerkungen angepasst werden.
@Target: Beschreiben Sie den Anwendungsbereich von Anmerkungen. @Target(ElementType .TYPE) gibt an, dass es auf eine Klasse oder Schnittstelle usw. wirkt.
@Retention: Gibt an, auf welcher Ebene die Anmerkungsinformationen gespeichert und zur Beschreibung verwendet werden müssen der Lebenszyklus der Annotation
#🎜 🎜#
Normalerweise verwenden benutzerdefinierte Annotationen @Retention(RetentionPolicy.RUNTIME), was den Laufzeiteffekt darstellt.
@Document: Gibt an, dass dieser Hinweis in das Javadoc aufgenommen wird.
@Iherited: Definiert, ob Unterklassen vererbbar sind Von der übergeordneten Klasse definierte Anmerkungen.
@Inherited ist nur für Annotationen vom Typ @Target(ElementType.TYPE) nützlich und kann nur eine Vererbung der Klasse sein, keine Vererbung der Schnittstelle: 1.4 Benutzerdefinierte Anmerkung
@Report(type = 1, value = "test")
public class CustomerAnnotation {
@Report(type = 1, value = "test")
public void testCustomerAnnotation() {
System.out.println("测试自定义注解");
}
}
Nach dem Login kopieren
#🎜 🎜# 2. Reflexion
2.1 Reflexion und Reflexionsmechanismus
Reflexion
Reflexion (Reflexion) bezieht sich auf Das Programm kann alles erhalten Informationen über ein Objekt zur Laufzeit.
Reflexionsmechanismus
Der Reflexionsmechanismus bedeutet, dass das Programm, wenn es ausgeführt wird, die Inhaltsinformationen jeder Klasse über die Reflection-API erhält. und kann alle internen Eigenschaften und Methoden des Objekts direkt bedienen.
2.2 So erhalten Sie die Class-Klasse und allgemeine Methoden
java.lang.Class-Klasse, die Kernklasse, die die Reflektion nach Abschluss des Klassenladens in der Methode implementiert Bereich des Heap-Speichers Es wird ein Klassenobjekt generiert (eine Klasse hat nur ein Klassenobjekt). Durch dieses Objekt können Sie die Struktur der Klasse sehen.
public class ClassOperateGenerics {
public Map<String, String> list() {
System.out.println("返回值是泛型");
return new HashMap<>();
}
public void test(Map<String, User> map, List<Integer> list) {
System.out.println("参数是泛型");
}
public static void main(String[] args) throws NoSuchMethodException {
/**
* 获取方法参数的泛型
*/
Method method = ClassOperateGenerics.class.getMethod("test", Map.class, List.class);
// 获取所有方法参数的泛型
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
// java.util.Map<java.lang.String, com.loner.mj.reflection.User>
System.out.println(genericParameterType);
if (genericParameterType instanceof ParameterizedType) {
// 获取所有泛型的真实参数
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
// String, User, Integer
System.out.println(actualTypeArgument);
}
}
}
/**
* 获取方法返回值的泛型
*/
Method list = ClassOperateGenerics.class.getMethod("list", null);
// 获取方法返回值的泛型
Type genericReturnType = list.getGenericReturnType();
if (genericReturnType instanceof ParameterizedType) {
// 获取所有泛型的真实参数
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type actualTypeArgument : actualTypeArguments) {
System.out.println(actualTypeArgument);
}
}
}
}
Nach dem Login kopieren
反射操作注解
public class ClassOperateAnnotation {
public static void main(String[] args) throws NoSuchFieldException {
Class<People> peopleClass = People.class;
// 获取类的所有注解
Annotation[] declaredAnnotations = peopleClass.getDeclaredAnnotations();
for (Annotation declaredAnnotation : declaredAnnotations) {
System.out.println(declaredAnnotation);
}
// 获取类的注解的值
Table declaredAnnotation = peopleClass.getDeclaredAnnotation(Table.class);
System.out.println(declaredAnnotation.value());
// 获取属性的注解
Field name = peopleClass.getDeclaredField("name");
Fields annotation = name.getAnnotation(Fields.class);
System.out.println(annotation.name());
}
}
Nach dem Login kopieren
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Anmerkungen und Reflexion in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn