1: Einführung in Java -Anmerkungen
Anmerkungen werden häufig in der Entwicklung verwendet, und ich sehe gelegentlich benutzerdefinierte Anmerkungen in Projekten. Lassen Sie uns heute diskutieren, was die Annotation ist, sowie die Anwendungsszenarien der Annotation und wie Sie die Annotation anpassen können.
Die folgenden Auflistungen in der Entwicklung in der Entwicklung listen
@Override: Wird verwendet, um zu identifizieren, dass die Methode von der Superklasse erbt. Wenn die Methode der übergeordneten Klasse gelöscht oder geändert wird, fordert der Compiler eine Fehlermeldung auf (Sie können dies immer auf der Methode toString () sehen, die wir am häufigsten sehen).
@Deprecated: Dies bedeutet, dass diese Klasse oder Methode veraltet ist und abgelaufen ist. Wenn der Benutzer es weiterhin verwenden möchte, wird eine Kompilierungswarnung generiert.
@SuppressWarnings: Compiler Warnmeldung für Ignorieren
JUNIT -Test: @test
Einige Anmerkungen von Spring: @Controller, @RequestMapping, @RequestParam, @Responsebody, @Service, @Component, @Repository, @Resource, @autovereRe
Anmerkungen zur Java -Überprüfung: @notnull, @email
Werfen wir einen Blick auf das wahre Gesicht des Mount Lu in der Annotation Override.java
@Target (elementtype.method) @Retention (retentionPolicy.source) public @Interface Override {} 2: Grundwissen über Java -Annotation
1. Java Annotation Datentyp
Anmerkungen werden in .java -Dateien geschrieben und verwenden @Interface als Schlüsselwort, sodass Annotationen auch ein Datentyp von Java sind. Aus einer umfassenden Definition, Klasse, Schnittstelle, Enum und Annotation sind alle Klassentypen.
2. Java Meta Annotation
Beim Erstellen von Anmerkungen müssen Sie einige Anmerkungen verwenden, um die von Ihnen erstellten Anmerkungen zu beschreiben, dh die Anmerkungen, die auf @Interface geschrieben wurden. Diese Anmerkungen werden als Meta -Anmerkungen bezeichnet, wie @Target, @Retention usw. in Override zu sehen. Hier sind einige Meta -Anmerkungen
@Documented: Wird verwendet, um zu markieren, ob die Annotation beim Generieren von Javadoc enthalten ist. Sie können sehen, dass diese Annotation mit @Override identisch ist, die Annotation leer ist und es nichts gibt.
@Dokumented@Retention (retentionPolicy.runtime) @target (elementtype.annotation_type) public @Interface dokumentiert {}@Target: Wird verwendet, um zu definieren, wo Anmerkungen verwendet werden können. Standardmäßig kann es überall verwendet werden oder den Gebrauchsumfang angeben. In der Entwicklung ist es häufiger, Anmerkungen zu Klassen (wie @Controller), Feldern (wie @Autowire), Methoden (wie @RequestMapping), Methodenparametern (wie @RequestParam) usw. zu verwenden.
Typ: Klasse, Schnittstelle oder Enum -Deklaration
Feld: Domäne (Attribut) Deklaration
Methode: Methodenerklärung
Parameter: Parameterdeklaration
Konstruktor: Konstruktormethode Deklaration
LOCAL_Variable: Lokale Variable Deklaration
Annotation_Type: Kommentartyperklärung
Paket: Paketanweisung
Target.java
@Documented@retention (retentionPolicy.runtime) @target (elementtype.annotation_type) public @Interface Ziel { /** * Gibt ein Array der Elemente zurück, auf die ein Annotationstyp * angewendet werden kann. * @return ein Array der Art von Elementen Ein Annotationstyp * kann auf */ elementtype [] value ();} angewendet werden public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Formal parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ Annotation_type, / ** Paketdeklaration* / Paket, ** Typ Parameter Deklaration* / type_parameter, / ** Verwendung eines Typs* / type_use}@Inherited: Ermöglicht die Unterklassen, die Annotationen in der übergeordneten Klasse zu erben und die Annotationen der übergeordneten Klasse durch Reflexion zu erhalten.
@Dokumented@Retention (retentionPolicy.runtime) @target (elementtype.annotation_type) public @Interface erbte {}@Constraint: Wird verwendet, um zu überprüfen, ob der Attributwert legal ist
@Documented@target ({elementtype.annotation_type})@retention (retentionPolicy.runtime) public @Interface Constraint {class <? erweitert ConstraintValidator <?,? >> [] validatedBy ();}| Es kann auf Quellcodeebene, Kompilierungsstufe (Byte -Code -Ebene) und Laufzeitebene überleben.
Quelle: Quellcode -Ebene, Anmerkungen sind nur im Quellcode vorhanden und werden im Allgemeinen zur Interaktion mit dem Compiler verwendet und werden zum Erkennen von Code verwendet. Wie @Override, @Suppresswarings.
Klasse: Bytecode -Ebene, Anmerkungen in Quellcode und Bytecode -Dateien. Sie werden hauptsächlich verwendet, um zusätzliche Dateien während der Kompilierung zu generieren, wie XML, Java -Dateien usw., können jedoch während der Laufzeit nicht erhalten werden. Beispielsweise generiert MyBatis Entitäts- und Zuordnungsdateien. Auf dieser Ebene ist es notwendig, einen Proxy (Javaagent) hinzuzufügen, wenn JVM geladen wird, und mit einem Proxy die Bytecode -Datei dynamisch ändern.
Laufzeit: Laufzeitstufe, Annotationen in Quellcode, Bytecode und Java Virtual Machines. Sie werden hauptsächlich für die Laufzeit verwendet, und Reflexion kann verwendet werden, um relevante Informationen zu erhalten.
@Dokumentierte@retention (retentionPolicy.runtime) @target (elementtype.annotation_type) public @Interface -Retention { /*** Gibt die Aufbewahrungsrichtlinie zurück. * @return die Aufbewahrungsrichtlinie */ retentionPolicy value ();} 3. Inhalt von Java -Anmerkungen
Im obigen Annotationsquellcode können Sie feststellen, dass einige Anmerkungen keinen Inhalt haben und einige Anmerkungen Inhalte haben, was wie eine Methode zu sein scheint.
Syntaxformat des kommentierten Inhalts: Datentyp -Attributname () Standard -Standardwert, Datentyp wird verwendet, um den Datentyp des Attributs zu beschreiben. Der Standardwert bedeutet, dass der Standardwert verwendet wird, wenn kein Attribut zugewiesen wird. Im Allgemeinen verwendet String eine leere Zeichenfolge "" als Standardwert, und Arrays verwenden im Allgemeinen ein leeres Array {} als Standardwert.
Schauen wir uns die Erklärung zur Annotation von RequestMapping in SpringMVC an
@Target ({Elementtype.method, elementtype.type})@retention (retentionPolicy.runtime)@documented@mapingPublic @Interface RequestMapPing {String name () default ""; @Aliasfor ("path") string [] value () Standard {}; @Aliasfor ("value") string [] path () Standard {}; RequestMethod [] method () Standard {}; String [] params () default {}; String [] Headers () Standard {}; String [] Consumers () Standard {}; String [] produziert () Standard {};}Verwenden von RequestMapping -Annotation in SpringMVC
@RequestMapping (value = "/list", method = requestMethod.post, produziert = {"application/json; charSet = utf-8;"}) public string list () {} 4. Verwenden Sie Szenarien von Anmerkungen
Sie können die Nutzungsszenarien von Anmerkungen durch die Anmerkungszeit der Deklaration analysieren:
Quell -Quellcode -Ebene: Für Compiler wie @Override, @Deprecated usw. gibt es nicht viele Szenarien, die Entwickler verwenden sollten.
Klasse: Bytecode -Ebene, dieser Teil ist selten zu sehen
Laufzeit: Laufzeitstufe, dies ist die häufigste, und fast alle von Entwicklern verwendeten Anmerkungen sind Laufzeitniveau. Laufzeitanmerkungen werden in den folgenden Situationen häufig verwendet
Annotation ohne Attribute in der Annotation. Dieser Teil der Annotation spielt normalerweise eine Rolle als Annotation, wie @Test, @before, @after. Durch das Erhalten dieser Tag -Anmerkungen erfolgt eine logische Verarbeitung.
Sie können die Einschränkungsannotation @Constraint verwenden, um den Attributwert wie @email, @notnull usw. zu überprüfen.
Sie können einige Parameter mithilfe von Eigenschaften in der Annotation konfigurieren und dann über die Reflexion verfügen, um diese Parameter zu erhalten. Diese Anmerkungen haben keine weiteren speziellen Funktionen, sie konfigurieren einfach einige Parameter anstelle einer XML -Konfiguration. Verwenden von Anmerkungen zum Konfigurieren von Parametern. Dies ist im Spring Start beliebt, wie z. B. @Configuration
In Bezug auf die Konfigurationsmethode XML VS Annotation konfigurieren Sie im Allgemeinen XML, um einige Konfigurationen zu konfigurieren, die nicht sehr nahe an der Geschäftsbeziehung liegen, und mit Annotationen einige Parameter konfigurieren, die eng mit dem Unternehmen verbunden sind.
Drei: Java Annotation and Reflection Basic API
// Annotation eines bestimmten Typs öffentlich <a erweitert Annotation> Eine getAnnotation (Klasse <a> AnnotationClass); // Alle Annotationen (einschließlich der Annotationen, die durch die in der Elternklasse ererbte Annotationen geändert werden) öffentliche Annotation [] getAnnotations () erhalten; // Erhalten Sie die Annotationen deklariert (aber enthält nicht die Annotationen, die in der übergeordneten Klasse geändert wurden). SecurityException; // Erhalten Sie eine bestimmte Methode öffentliche Methode getMethod (String -Name, Klasse <?> ... Parametertype);
Vier: benutzerdefinierte Anmerkungen
Verwenden Sie benutzerdefinierte Anmerkungen + Interceptors oder AOPs, um die Berechtigungen zu kontrollieren.
Das folgende Beispiel wird verwendet, um eine Annotation zu definieren, um den Benutzer beim Zugriff auf eine Schnittstelle einzuschränken.
Schritt 1: Definieren Sie die Annotation
Erfordert login.java
@Documented@target ({Elementtype.method})@retention (retentionPolicy.runtime) public @Interface fordertLogin {}Schritt 2: Verwenden Sie Annotationen
@Controller @requestMapping ("/user") public class userController {@RequiresLogin @RequestMapping (value = "/list", produziert = {"application/json; charset = utf-8;"}) public String getUerList () {System.out.println ("--------------------"); return "[{'id': 1, 'Benutzername': 'Zhangsan'}]"; }}Schritt 3: Verwenden Sie AOP, um die Anmerkungen abzufangen und analysieren
public class loginAdvices {public void vor (joinpoint JoinPoint) löst Ausnahme aus {Object target = joinpoint.gettarget (); String methodName = joinpoint.getSignature (). GetName (); System.out.println (Ziel + "-------" + methodName); Method method = target.getClass (). GetMethod (methodName); boolesche AnnotationPresent = methode.isannotationPresent (erfordert login.class); if (AnnotationPresent) {// Der Benutzer muss sich in boolean islogin = false anmelden; if (! islogin) {werfen Sie eine neue Ausnahme aus ("Sie müssen sich anmelden, um auf diese Schnittstelle zuzugreifen"); } else {System.out.println ("Login ..."); }}}}Konfigurieren Sie AOP in applicationContext.xml
<bean id = "loginAdvices"/> <!-AOP-Konfiguration-> <AOP: Konfigurationsproxy-Target-Class = "True"> <!-Abschnitt-> <AOP: Aspekt ref = "loginAdvices"> <!-point-> <aop: pointcut id = "pointcut1" expression = "Ausführung (*). Benachrichtigungsmethode und Point-> <AOP: vor method = "vor" pointcut-ref = "pointCut1"/> </aop: Aspekt> </aop: config>
Benutzerdefinierte Ausnahmen
Warum Ausnahmen anpassen?
Obwohl Java eine Vielzahl von Ausnahmebehandlungskursen bietet, werden häufig in Projekten benutzerdefinierte Ausnahmen verwendet. Der Hauptgrund ist, dass die von Java bereitgestellten Ausnahmeklassen in einigen Fällen immer noch nicht die Bedürfnisse verschiedener Unternehmen erfüllen können. Beispielsweise entsprechen einige Fehler im System der Java -Syntax, entsprechen jedoch nicht der Geschäftslogik. Wenn das Konto nicht vorhanden ist, wenn sich der Benutzer anmeldet oder das Konto gesperrt ist, können Sie ein Konto -Ausnahmekonto anpassen.
Oder in einigen Fällen kann die gleiche Ausnahme in Java aus mehreren Gründen verursacht werden. Es ist nicht einfach, Fehler bei der Fehlerbehebungsproblemen zu finden. Zu diesem Zeitpunkt können Sie eine klare Ausnahme anpassen.
Vorteile von benutzerdefinierten Ausnahmen: Benutzerdefinierte Ausnahmen können Ausnahmen klarer und zugrunde liegende Ausnahmen ausblenden, was sicherer und intuitiver ist.
Verwendung von benutzerdefinierten Ausnahmen: Benutzerdefinierte Ausnahmen werden im Allgemeinen von Ausnahme oder RunTimeException geerbt. Nach geschäftlichen Bedürfnissen können einige Attribute als Parameter des Konstruktors angesehen werden. Für benutzerdefinierte Ausnahmen müssen Programmierer Ausnahmen manuell veröffentlichen und Ausnahmen behandeln.
Unten finden Sie ein Beispiel für benutzerdefinierte Ausnahmen in Apache Shiro
öffentliche Klasse shiroException erweitert RunTimeException {public shiroException () {} public shiroException (String message) {Super (message); } public shiroexception (throwable cause) {Super (cause); } public ShiroException (String -Nachricht, Throwable Cause) {Super (Nachricht, cause); }}Das obige ist eine detaillierte Beschreibung der Java -Annotation und benutzerdefinierten Anmerkungen