[자바] 성격과 정의 구현의 주석 기반을

자바 주석의 원리

I. 서론

Java5는, 사용하기 전에 xml주요 기존의 프레임 워크의 동작을 구성,이 방법은 느슨한 결합하고 거의 모든 필요를 구성하는 전체 프레임 워크를 달성 할 수 있지만, 확장 프로젝트, xml파일 자체의 내용은 매우 복잡, 유지 보수 될 것입니다 비용은 크게 증가했다.

따라서, 정보 또는 메타 데이터 (메타 데이터)를 프로그램 소자 연관된 (클래스, 메소드, 멤버 변수 등), 특수 효과를위한 유사한 메커니즘을 제공 할 수있는 높은 태그 결합 구성을 사용하는 것이 제안되었다. 이 프로그램 요소 (클래스, 메소드, 멤버 변수) 플러스 직관적 설명 연관되지만 어떤 서비스 로직 자체 프로그램 명령은 독립적으로, 특정 도구 또는 프레임 워크를 제공하도록 설계된다.

둘째, 주석, 무엇의 본질은 무엇인가?

자바에서 주석 편집, 해석과 실행 시간의 사용되는 도구 중 일부에 대한 추가 정보의 소스 코드의 일부, 지침, 구성 기능을한다. 개질제 선언 클래스, 메소드, 매개 변수에 적용하면 이해에 주석을 달 수있다. 참고 코드 자체는 단지 성적 지원하는 역할을 할 수있다, 비즈니스 로직에 영향을주지 않습니다.

자바 주석 인터페이스에 대한 설명은 너무 많은 단어가 있습니다 :

그것은 의미 :이 인터페이스는 모든 주석 형은 공통 인터페이스를 상속합니다. 이 문장은 이해하기 어려울 수 있습니다. 우리의 공동으로 @Override노트를 예로 들어 다음과 같이 소스 코드는 다음과 같습니다

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

위의 코드는 다음이 다음과 같은 하위 하위해야한다, 우리의 일반적인 형식을 이해하기 :

public interface Override extends Annotation {
    
}

그것의 본질은 상속 된 인터페이스 주석 인터페이스로 이제 당신은, 소위 메모를 이해할 수있다.

코드 워드를 구문 분석 상응하는 다른 구현 클래스는, 효과가 유용하지 않을 수 있습니다 경우 인터페이스로, 그리고 주석이 와서.

우리는 좋은 코멘트를 정의 할 때, 우리는 기본 코드 도움이 필요 주석은 그 때문에 역할을 담당 할 것입니다. 런타임 프록시 클래스에서 동적으로 생성 된 코드의 구현 클래스입니다 특별한 인터페이스로 주석하면서 프록시 개체를 동적으로 생성 된 Java 런타임을 반환 반사의 방법에 의해 획득 된 기본 코드 주석 후 $Proxy. 프록시 프록시 객체 오브젝트에 의해 정의 주석 (인터페이스) 메서드 호출을 , 그것을 호출 종료됩니다 방법. 행이 방법 대응 값의 인덱스. 자바 상수 풀의 소스.AnnotationInvocationHandlerinvokememberValuesMapmemberValues

셋째, 메타 주석

주석이 기본 코드를 도울 필요가 특정 기능을 달성 할 수있는 인터페이스는 본질적이기 때문에, 우리는 우리가 기본 코드이 댓글이 할 수 있도록 할 필요가 알아? 자바는 우리가 문제를 해결하는 데 도움이 메타 주석을 제공합니다.

메타 주석은 사용자 정의 주석에 대한 자바 주석 수정 노트 제공됩니다.

주석이 사위안 노트의 총입니다 :

@Target은 : 대상의 역할을 지적,
@Retention : 주석 문 기간;
@ 상속 : 상속을 허용할지 여부를 나타냅니다
@Documented : 노트가의 JavaDoc에 포함할지 여부를;

@목표

이 주석을 지정하는 데 사용되는 역할의 수정 된 최종 노트에 지정된 대상을 @Target하는 마지막 방법, 또는 수정 클래스를 수정하거나 수정 속성하는 데 사용됩니다?

@Target 소스 코드는 다음과 같다 :

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

상기 예 @Override 소스 코드, 다음 @Target(ElementType.METHOD)으로 그것이 단지 주석에 사용될 수있는이 방법의 코드를 수정하여 제시 한 클래스가 사용 또는 특성을 개질 할 수 없다. 열거 타입이다 ElementType에는 선택할 수있는 다음과 같은 값을 가진다 :

클래스, 인터페이스, 열거에서 수정 된 역할에 대한 의견을 허용 : ElementType.TYPE를

ElementType.FIELD는 : 속성 필드에 역할을 할 수

ElementType.METHOD는 :의 방법에 따라 행동 할 수

ElementType.PARAMETER는 : 메소드 매개 변수에 따라 행동 할 수

ElementType.CONSTRUCTOR는 : 생성자에 따라 행동 할 수

ElementType.LOCAL_VARIABLE은 : 로컬 로컬 변수에 따라 행동 할 수

ElementType.ANNOTATION_TYPE는 : 노트에 역할을 할 수

ElementType.PACKAGE는 : 클래딩에 따라 행동 할 수

@Retation

@Retention 주석은 다음과 같이 현재의 수명주기는 소스 코드가 있음을 나타냅니다 :

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}

상술과 일치 코멘트는 속성 값을 가지며, 이는 또한 다음과 같은 값을 포함 RetentionPolicy 열거 형을 제공한다 :

RetentionPolicy.SOURCE는 : 컴파일시에 폐기. 컴파일러의 끝 부분이 주석이 더 이상 바이트를 작성하지 않는, 어떤 의미가 없습니다. @Override, @SuppressWarnings는 의견에 속한다.

RetentionPolicy.CLASS : 클래스 로딩 폐기 할 때. 유용한 바이트 코드 파일. 참고이 방법을 기본

RetentionPolicy.RUNTIME은 : 실행 또한 메모를 유지 폐기되지 않습니다, 그래서 당신은 주석 정보를 알아볼 수 반사를 사용할 수 있습니다. 일반적으로이 방법에 사용되는 우리의 사용자 정의 주석.

@Documented & @Inherited

우리는 포장 할 때 반대가 삭제됩니다에 Javadoc 문서 패키지, 문서 문서에 저장됩니다 실행할 때 @Documented 코멘트는 코멘트를 수정했습니다.

주석 노트는이 상속 수정 또한 우리가 클래스를 수정하고, 그 클래스의 서브 클래스가 자동으로 상위 클래스 노트를 상속 있다고 지적한다 @Inherited.

넷째, 일반적인 주석

@보수

java.lang.Override는 표지 방법으로 사용되는 마커 주석 형이다. 또한이 방법은, 상위 클래스의 과부하 표시된 도면은 주장 역할을했다. 우리가 커버하지 않는 부모 클래스의 방법의 방법이 주석을 사용하는 경우, 자바 컴파일러 경고는 컴파일 오류가 될 것입니다.

@Deprecated

사용되지 않는 마커 주석의 유형입니다. 유형 또는 유형 부재 @Deprecated 수정을 사용하면, 다음이 컴파일러는 프로그램 요소의 사용이 표시되어 장려한다. 따라서이 수정의 사용이 특정 "연속성"이 있습니다 상속 또는 유형이 @Deprecated로 선언 된 후이 적용되지 않습니다하지만 우리가 상속을 통해 또는이 사용되지 않는 형식이나 멤버 또는 멤버를 사용하여 코드 모드로 덮여있는 경우, 하지만 컴파일러는 여전히 경찰에보고했다.

@SuppressWarnings

하지 마크 형의 주석을 SuppressWarning. 그것은 문자열 []에 회원의 유형이 금지 경고 이름의 구성원입니다. javac 컴파일러에 관한 한 경우, 옵션은 @SuppressWarings 이름 -Xlint 효과적인 경고도 효과적이지만, 컴파일러는 무시 경고 이름을 인식하지 못합니다. @SuppressWarnings ( "선택 해제")

V. 사용자 정의 주석

사용자 정의 주석 범주를 작성하기위한 몇 가지 규칙 :

  1. 주석 유형은 모든 주석이 자동으로이 인터페이스 java.lang.annotation의를 상속, @ 인터페이스로 정의하고, 다른 클래스 또는 인터페이스를 상속 갈 수 없습니다.
  2. 매개 변수는이 두 개조로 디폴트 (기본값) 액세스의 공용 또는 멤버를 사용할 수 있습니다
  3. 회원은 유일한 유형 바이트, 짧은, 문자, INT, 긴, 플로트, 더블, 부울 8 가지 기본 데이터 형과 문자열, 열거, 클래스, 주석 및 기타 데이터 유형의 기본 매개 변수뿐만 아니라,이 배열의 몇 가지 유형을 사용할 수 있습니다.
  4. 클래스 메소드와 필드의 주석 정보가 자바 주석을 통해 얻을 수 있어야는 반사 기술을 객체뿐만 아니라 당신은 객체 주석을 얻을 수있는 다른 방법이 없기 때문에
  5. 참고 또한 회원을 정의 할 수 있습니다 ,,하지만 그런 쓸데에 대해서는 언급하지 않았다
PS:自定义注解需要使用到元注解

여섯 사용자 정의 주석 예

FruitName.java

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 水果名称注解
 */
@Target(ElementType.FIELD)
@Retention(RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}

FruitColor.java

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 水果颜色注解
 */
@Target(FIELD)
@Retention(RUNTIME)
@Documented
public @interface FruitColor {
    /**
     * 颜色枚举
     */
    public enum Color{ BLUE,RED,GREEN};
    
    /**
     * 颜色属性
     */
    Color fruitColor() default Color.GREEN;

}

FruitProvider.java

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;


/**
 * 水果供应者注解
 */
@Target(FIELD)
@Retention(RUNTIME)
@Documented
public @interface FruitProvider {
    /**
     * 供应商编号
     */
    public int id() default -1;
    
    /**
     * 供应商名称
     */
    public String name() default "";
    
    /**
     * 供应商地址
     */
    public String address() default "";
}

FruitInfoUtil.java

import java.lang.reflect.Field;

/**
 * 注解处理器
 */
public class FruitInfoUtil {
    public static void getFruitInfo(Class<?> clazz){
        
        String strFruitName=" 水果名称:";
        String strFruitColor=" 水果颜色:";
        String strFruitProvicer="供应商信息:";
        
        Field[] fields = clazz.getDeclaredFields();
        
        for(Field field :fields){
            if(field.isAnnotationPresent(FruitName.class)){
                FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);
                strFruitName=strFruitName+fruitName.value();
                System.out.println(strFruitName);
            }
            else if(field.isAnnotationPresent(FruitColor.class)){
                FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);
                strFruitColor=strFruitColor+fruitColor.fruitColor().toString();
                System.out.println(strFruitColor);
            }
            else if(field.isAnnotationPresent(FruitProvider.class)){
                FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class);
                strFruitProvicer=" 供应商编号:"+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address();
                System.out.println(strFruitProvicer);
            }
        }
    }
}

Apple.java

import test.FruitColor.Color;

/**
 * 注解使用
 */
public class Apple {
    
    @FruitName("Apple")
    private String appleName;
    
    @FruitColor(fruitColor=Color.RED)
    private String appleColor;
    
    @FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")
    private String appleProvider;
    
    public void setAppleColor(String appleColor) {
        this.appleColor = appleColor;
    }
    public String getAppleColor() {
        return appleColor;
    }
    
    public void setAppleName(String appleName) {
        this.appleName = appleName;
    }
    public String getAppleName() {
        return appleName;
    }
    
    public void setAppleProvider(String appleProvider) {
        this.appleProvider = appleProvider;
    }
    public String getAppleProvider() {
        return appleProvider;
    }
    
    public void displayName(){
        System.out.println("水果的名字是:苹果");
    }
}

FruitRun.java

/**
 * 输出结果
 */
public class FruitRun {
    public static void main(String[] args) {
        FruitInfoUtil.getFruitInfo(Apple.class);
    }
}

운영 결과는 다음과 같습니다


과일 이름 : 애플
과일 색상 : RED
공급 업체 코드 : 공급 업체 이름 1 : 섬서성 후지 그룹 공급자 주소 : 서안, 산시 성, 연안 도로, 건물 89 후지

VII 참조

  • https://www.cnblogs.com/acm-bingzi/p/javaAnnotation.html

침해하는 경우, 삭제에 문의하시기 바랍니다!

추천

출처www.cnblogs.com/jojop/p/11327895.html