0

다음과 같은 코드를 작성하고 싶습니다. 객체를 생성하는 동안 주석을 처리하고 기본값을 설정하는 방법

MyClass a = new @MyAnnotation MyClass() 

어떤 사람이 주석 MyClass에의 목적을지지 그래서

public class MyClass { 

    int a; 

    public void setValue(int a) { 
     this.a = a; 
    } 

} 

, 그것은 어떤 X에 기본 값을 설정해야합니다 아래와 같이 MyClass의 방법 모양 (20 말) 가정합니다.

체커 프레임 워크에서는 아래 코드와 같이 주석을 달 수 있습니다.

MyClass a = new @MyAnnotation MyClass() 

아래와 같이 컴파일 할 때 어떻게 두 부분으로 나눌 수 있습니까?

MyClass a = new MyClass(); 
    a.setValue(20); 

아래와 같이 defauilt 값을 전달할 수있는 경우에도 좋습니다.

MyClass a = new @MyAnnotation(value=20) MyClass() 

annotation processor/ASM과 같은 바이트 코드 프로세서를 사용해야 할 필요가 있습니까? 의미있는 방식으로 업데이트되었습니다.

+0

왜 생성자를 만들지 않습니까? 또한 당신의'setValue (a)'는'Test'의 타입을 반환합니다. 그러나 본문에서'this'를 리턴 했습니까? – Kent

+0

MyClass로 변경했습니다. 오타였습니다. – Mahesh

+0

그것은 의미가 없으며 인스턴스 메서드이며 동일한 인스턴스를 반환합니다. – Kent

답변

1

메타 특수 효과를 통해 맞춤형 시스템을 작성 하시겠습니까? 즉, SubtypingChecker을 사용하고 있습니까? 아니면 BaseTypeChecker의 하위 유형을 만들었습니까?

간단히 대답하면 메타 주석을 사용하면 이러한 종류의 동작을 지정할 수 없습니다. 긴 대답은 사용자 정의 검사기가있는 경우이를 수행 할 수있는 여러 가지 방법이 있다는 것입니다.

그러나 사용자 정의 검사기를 작성하는 것은 메타 주석을 사용하여 훨씬 더 복잡합니다. ,

  1. 가 @PolyMyAnnotation 다형성 주석을 작성 Polymorphic Qualifiers
  2. 는 다형성 만들기를 참조하십시오 :

    옵션 A : 단계 다형성 생성자 사용자 정의 검사를한다면, 다음 중 하나를 수행 할 수 있습니다 MyClass의 생성자, 예. @ PolyMyAnnotation MyClass (@ PolyMyAnnotation int a) {}

  3. @MyAnnotation을 int 리터럴 유형에 추가하는 TreeAnnotator를 만듭니다. 예를 들어 RegexTreeAnnotator.visitLiteral을 참조하십시오.
  4. AnnotatedTypeFactory에서 사용하는 TreeAnnotators 목록에 TreeAnnotator를 추가하십시오. (

    1. 가 건설되고 객체가 MyClass의 인스턴스 인 경우
    2. 이 확인 TreeAnnotator
    3. 재정 visitNewClass를 확장하는 클래스를 만듭니다를 사용하여 A TreeAnnotator 단계 : (RegexAnnotatedTypeFactory

    옵션 B를 참조하십시오 ElementUtils.getQualifiedClassName 및 ElementUtils.isObjectType을 참조하십시오.

  5. 생성되는 클래스가 MyCl의 인스턴스 인 경우 엉덩이, 그렇다면 인수가 정수 리터럴인지 확인하십시오.
  6. 항목이 리터럴 인 경우 리터럴을 구문 분석하고 생성되는 유형에 값을 추가하십시오. 참고 : 리터럴 이외의 문자를 처리하려는 경우 int a = 20; new MyClass (a)

그런 다음 ValueChecker를 사용할 수 있습니다. 형식 팩토리가 ValueAnnotatedTypeFactory를 상속하는 경우 상수 전파를 지원합니다. 데이터 흐름 API는 상수 전파에 대한 일부 지원을 제공합니다.

옵션 C : 사용자 정의 데이터 흐름의 CFAbstractTransfer 함수 그러나 사용자 정의 검사기가있는 경우 CFAbstractTransfer.visitMethodInvocation을 재정 의하여 setValue가 호출 된시기를 감지하고 이에 따라이를 조정할 수 있습니다. 예를 들어 RegexTransfer을 보거나 CFAbstractTransfer를 확장하거나 TransferFunction을 구현하는 메소드를 검색 할 수 있습니다.

데이터 흐름은 유형 상태 시스템을 대신 할 수 없습니다 (이 내용은 Typestate checkers 참조).

+0

어노테이션을 처음 사용하고 어떻게 구현할 수 있는지 알아 내려고합니다. 더 의미있는 방법으로 질문을 업데이트했습니다. 당신이 언급했거나 ASM을 사용해야 할 수 있습니까? – Mahesh

관련 문제