1 : Java 주석 소개
주석은 종종 개발에 사용되며 때로는 프로젝트에서 맞춤형 주석이 있습니다. 오늘, 주석이 무엇인지, 주석의 응용 시나리오와 주석을 사용자 정의하는 방법에 대해 논의 해 봅시다.
다음은 개발 중 공통 주석을 나열합니다
@override : 메소드가 슈퍼 클래스에서 상속되는 것을 식별하는 데 사용됩니다. 상위 클래스의 메소드가 삭제되거나 수정되면 컴파일러는 오류 메시지를 자극합니다 (가장 자주 볼 수있는 ToString () 메소드에서 항상 볼 수 있습니다).
@deprecated :이 클래스 또는 메소드가 더 이상 사용되지 않고 만료되었음을 의미합니다. 사용자가 여전히 사용하려면 컴파일 경고가 생성됩니다.
@SuppressWarnings : 무시를위한 컴파일러 경고 메시지
주니 테스트 : @Test
스프링의 일부 주석 : @controller, @requestmapping, @requestparam, @responsebody, @service, @component, @repository, @resource, @autowire
Java 검증에 대한 주석 : @notnull, @email
주석 재정의에서 Lu 산의 진정한 얼굴을 살펴 보겠습니다.
@TARGET (ElementType.Method) @retention (rendentionpolicy.source) public @interface atredid {} 2 : Java 주석에 대한 기본 지식
1. Java 주석 데이터 유형
주석은 .java 파일로 작성되며 @Interface를 키워드로 사용하므로 주석은 Java의 데이터 유형이기도합니다. 광범위한 정의, 클래스, 인터페이스, 열거 및 주석은 모두 클래스 유형입니다.
2. 자바 메타 주석
주석을 만들 때 생성 한 주석, 즉 @interface에 작성된 주석을 설명하기 위해 주석을 사용해야합니다. 이러한 주석을 @Target, @retention 등과 같은 메타 주석이라고합니다. 다음은 메타 주석이 있습니다
@Documented : Javadoc을 생성 할 때 주석이 포함되어 있는지 여부를 표시하는 데 사용됩니다. 이 주석이 @override와 동일하고 주석이 비어 있고 아무것도 없습니다.
@documented@rendent (rendentionpolicy.runtime) @target (elementtype.annotation_type) public @interface 문서화 된 {}@target : 주석을 사용할 수있는 위치를 정의하는 데 사용됩니다. 기본적으로 어디서나 사용할 수 있거나 사용 범위를 지정할 수 있습니다. 개발에서 클래스 (예 : @controller), 필드 (예 : @autowire), 메소드 (예 : @requestmapping), 메소드 매개 변수 (예 : @requestparam) 등에 주석을 사용하는 것이 일반적입니다.
유형 : 클래스, 인터페이스 또는 열거 선언
필드 : 도메인 (속성) 선언
방법 : 메소드 선언
매개 변수 : 매개 변수 선언
생성자 : 생성자 방법 선언
Local_variable : 로컬 변수 선언
annotation_type : 댓글 유형 선언
패키지 : 패키지 명령문
Target.java
@documented@rendent (retentionpolicy.runtime) @target (elementtype.annotation_type) public @interface target { /** * 주석 유형 *에 적용 할 수있는 요소의 종류를 반환합니다. * @return 주석 유형 *에 */ elementType [] value ();}에 적용될 수 있습니다. public enum elementType { /** 클래스, 인터페이스 (주석 유형 포함) 또는 열거 선언* /유형, /** 필드 선언 (Enum 상수 포함)* /필드, /** 메소드 선언* /메소드, /** 정식 매개 변수 선언* /매개 변수, /** local _variable toletation* /local_variable, /*allariable plublaration* /parameter, /** 구성 요소 선언*/ annotation_type,/ ** 패키지 선언*/ 패키지,/ ** 유형 매개 변수 선언*/ type_parameter,/ ** 유형의 사용*/ type_use}@Inherited : 서브 클래스가 상위 클래스에서 주석을 물려받을 수 있도록하고 반사를 통해 부모 클래스의 주석을 얻을 수 있습니다.
@documented@rendent (retentionpolicy.runtime) @target (elementtype.annotation_type) public @interface inherited {}@Constraint : 속성 값이 합법적인지 확인하는 데 사용됩니다.
@documented@target ({elementtype.annotation_type})@retention (retentionpolicy.runtime) public @interface sonstraint {class <? restaintvalidator <?,? >> [] validatedby ();}을 확장합니다.@retention : 주석의 선언주기는 주석의 생존 단계를 정의하는 데 사용됩니다. 소스 코드 레벨, 컴파일 레벨 (바이트 코드 레벨) 및 런타임 레벨에서 생존 할 수 있습니다.
출처 : 소스 코드 레벨, 주석은 소스 코드에만 존재하며 일반적으로 컴파일러와 상호 작용하는 데 사용되며 코드를 감지하는 데 사용됩니다. @override, @suppresswarings와 같은.
클래스 : 바이트 코드 레벨, 주석은 소스 코드 및 바이트 코드 파일에 존재합니다. XML, Java 파일 등과 같은 컴파일 중에 추가 파일을 생성하는 데 주로 사용되지만 런타임에는 얻을 수 없습니다. 예를 들어, MyBatis는 엔터티 및 매핑 파일을 생성합니다. 이 레벨에서는 JVM이로드 될 때 프록시 (Javaagent)를 추가하고 프록시를 사용하여 바이트 코드 파일을 동적으로 수정해야합니다.
런타임 : 런타임 레벨, 주석은 소스 코드, 바이트 코드 및 Java 가상 머신에 존재합니다. 주로 런타임에 사용되며 반사는 관련 정보를 얻는 데 사용될 수 있습니다.
@Documented@rendent (retentionpolicy.runtime) @target (elementtype.annotation_type) public @interface rendention { /*** 보존 정책을 반환합니다. * @유지 정책 */ retentionpolicy value ();} 3. Java 주석의 내용
위의 주석 소스 코드에서 일부 주석에는 내용이 없으며 일부 주석에는 내용이있는 것으로 보입니다. 이는 메소드처럼 보입니다.
주석이 달린 컨텐츠의 구문 형식 : 데이터 유형 속성 이름 () 기본값 기본값, 데이터 유형은 속성의 데이터 유형을 설명하는 데 사용됩니다. 기본값은 속성이 할당되지 않으면 기본값이 사용됨을 의미합니다. 일반적으로 String은 기본값으로 빈 문자열 "" "를 사용하고 배열은 일반적으로 빈 배열 {}를 기본값으로 사용합니다.
SpringMVC에서 RequestMapping의 주석에 대한 설명을 살펴 보겠습니다.
@TARGET ({ElementType.Method, ElementType.Type})@retention (retentionPolicy.runtime)@documented@mappingpublic @interface requestMapping {String name () 기본값 "; @Aliasfor ( "path") String [] value () default {}; @Aliasfor ( "value") String [] path () default {}; requestMethod [] method () default {}; 문자열 [] params () default {}; 문자열 [] headers () default {}; 문자열 [] 소비자 () default {}; String [] cromewes () default {};}SpringMVC에서 요청 매핑 주석을 사용합니다
@RequestMapping (value = "/list", method = requestmethod.post, produces = { "application/json; charset = utf-8;"}) public string list () {} 4. 주석 시나리오를 사용하십시오
주석의 선언 기간을 통해 주석의 사용 시나리오를 분석 할 수 있습니다.
소스 소스 코드 레벨 : @override, @deprecated 등과 같은 컴파일러의 경우 개발자가 사용해야하는 시나리오가 많지 않습니다.
클래스 : 바이트 코드 레벨,이 부분은 거의 볼 수 없습니다
런타임 : 런타임 수준에서 가장 일반적이며 개발자가 사용하는 거의 모든 주석은 런타임 수준입니다. 런타임 주석은 일반적으로 다음 상황에서 사용됩니다
주석에 속성이없는 주석. 주석 의이 부분은 일반적으로 @test, @before, @after와 같은 주석으로 역할을합니다. 이러한 태그 주석을 얻어 일부 논리적 처리가 수행됩니다.
제약 조건 주석 @constraint를 사용하여 @email, @notnull 등과 같은 속성 값을 확인할 수 있습니다.
주석에서 속성을 사용하여 일부 매개 변수를 구성한 다음 반사를 사용하여 이러한 매개 변수를 얻을 수 있습니다. 이러한 주석에는 다른 특수 기능이 없으며 XML 구성 대신 일부 매개 변수를 구성합니다. 주석을 사용하여 매개 변수를 구성합니다. @Configuration과 같은 스프링 부팅에서 인기가 있습니다.
구성 방법 XML 대 주석과 관련하여 일반적으로 XML을 사용하여 비즈니스 관계에 매우 가깝지 않은 일부 구성을 구성하고 주석을 사용하여 비즈니스와 밀접하게 관련된 일부 매개 변수를 구성하십시오.
3 : Java 주석 및 반사 기본 API
// 특정 유형의 주석을 가져옵니다 <a extends annotation> getAnnotation (class <a> annotationclass); // 모든 주석 (부모 클래스에 상속 된 주석 포함) 공개 주석 [] getAnnotations (); // 주석이 선언 된 주석을 가져옵니다 (하지만 부모 클래스에 상속 된 주석은 포함되지 않음) 공개 주석 [] getDeclaredAnnotations (); // 주석에 의해 개체가 주석이 달린지 테스트하여 공개 부울 isannotationPresent (class <? extends annotation> Annotation Class) // get get get get get get get getdeDf) SecurityException; // 특정 메소드 가져 오기 공개 메소드 getMethod (문자열 이름, 클래스 <?> ... ParameterTypes);
4 : 사용자 정의 주석
권한을 제어하기 위해 사용자 정의 주석 + 인터셉터 또는 AOP를 사용하십시오.
다음 예제는 인터페이스에 액세스 할 때 사용자의 로그인을 제한하기 위해 주석을 정의하는 데 사용됩니다.
1 단계 : 주석을 정의합니다
leduestLogin.java
@documented@target ({elementtype.method})@retention (retentionpolicy.runtime) public @interface requestLogin {}2 단계 : 주석을 사용하십시오
@Controller@RequestMapping("/user")public class UserController { @RequiresLogin @RequestMapping(value = "/list", produces = {"application/json;charset=UTF-8;"}) public String getUserList(){ System.out.println("----------------------"); "[{ 'id': 1, 'username': 'zhangsan'}]; }}3 단계 : AOP를 사용하여 주석을 가로 채고 구문 분석합니다.
public class loginadvices {public void ever (joinpoint joinpoint) 예외 {object target = joinpoint.getTarget (); String MethodName = joinpoint.getSignature (). getName (); System.out.println (대상 + "-------" + MethodName); 메소드 메소드 = target.getClass (). getMethod (MethodName); 부울 주석 프리 젠트 = method.isannotationPresent (requessLogin.class); if (AnnotationPresent) {// 사용자는 부울 Islogin = false에 로그인해야합니다. if (! islogin) {throw new Exception ( "이 인터페이스에 액세스하려면 로그인해야한다"); } else {System.out.println ( "로그인 ..."); }}}}ApplicationContext.xml에서 AOP를 구성하십시오
<bean id = "loginAdvices"/> <!-AOP 구성-> <aop : config proxy-target class = "true"> <!-섹션-> <aop : aop : "loginadvices"> <!-point-> <aop : pointcut id = "pointcut1"exprede = "execution (*com.mengdee.manager.controller.). <!-연결 알림 메소드 및 포인트-> <aop : 이전 메소드 = "pointcut-ref ="pointcut1 "/> </aop : 측면> </aop : config>
맞춤형 예외
예외를 사용자 정의하는 이유
Java는 다양한 예외 처리 클래스를 제공하지만 커스텀 예외는 종종 프로젝트에 사용됩니다. 주된 이유는 Java가 제공하는 예외 클래스가 여전히 다양한 비즈니스의 요구를 충족시킬 수 없기 때문입니다. 예를 들어, 시스템의 일부 오류는 Java 구문을 준수하지만 비즈니스 로직을 준수하지 않습니다. 사용자가 로그인하거나 계정이 잠긴 경우 계정이 존재하지 않으면 계정 예외 Accountexception을 사용자 정의 할 수 있습니다.
또는 경우에 따라 Java에서 동일한 예외는 여러 가지 이유로 인해 발생할 수 있습니다. 문제를 해결할 때 오류를 찾는 것은 쉽지 않습니다. 현재보다 명확한 예외의 사용자 정의를 사용할 수 있습니다.
사용자 정의 예외의 이점 : 맞춤 예외는 예외를보다 명확하게 만들고 기본 예외를 숨길 수 있으며, 이는 더 안전하고 직관적입니다.
사용자 정의 예외 사용 : 사용자 정의 예외는 일반적으로 예외 또는 runtimeexception에서 상속됩니다. 비즈니스 요구에 따라 일부 속성은 생성자의 매개 변수로 취할 수 있습니다. 사용자 정의 예외는 프로그래머가 수동으로 예외를 던지고 예외를 처리해야합니다.
아래는 Apache Shiro의 사용자 정의 예외의 예입니다.
공개 클래스 ShiroException은 runtimeexception {public shiroException () {} public shiroException (문자열 메시지) {super (메시지); } public shiroexception (던질 가능한 원인) {슈퍼 (원인); } public shiroException (문자열 메시지, 던질 가능한 원인) {super (메시지, 원인); }}위는 Java 주석 및 맞춤형 주석에 대한 자세한 설명입니다.