티스토리 뷰

반응형

 

다음은 사용자 지정 Annotation에서 선택적 요소 및 추가 속성을 정의하는 방법입니다.

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/* JavaScriptMethod.java */
@Retention(RetentionPolicy.RUNTIME)
public @interface JavaScriptMethod {
    String value(); // Required element

    int count() default 1; // Optional element with a default value

    String[] tags() default {}; // Optional element of array type with a default value

    boolean enabled() default true; // Optional element of boolean type with a default value

    Level level() default Level.INFO; // Optional element of enum type with a default value

    // Additional annotation properties (annotation meta-annotations) can be added here

    // Enum type for the 'level' element
    enum Level {
        INFO,
        WARNING,
        ERROR
    }
}

 

 

@JavaScriptMethod Annotation:

  1. value() 요소는 기본값이 없는 필수 요소입니다. 기본값이 지정되어 있지 않으므로 주석을 사용할 때 반드시 제공되어야 합니다.
  2. count() 요소는 기본값이 1인 선택적 요소입니다. 값이 명시적으로 제공되지 않으면 기본값은 1입니다.
  3. tags() 요소는 빈 배열을 기본값으로 하는 배열 유형(String[])의 선택적 요소입니다. 값이 제공되지 않으면 기본적으로 빈 배열이 됩니다.
  4. enabled() 요소는 기본값이 true인 부울 유형의 선택적 요소입니다. 값이 명시적으로 제공되지 않으면 기본값은 true입니다.
  5. level() 요소는 기본값이 Level.INFO인 enum 유형(Level)의 선택적 요소입니다. 값이 제공되지 않으면 기본값은 Level.INFO입니다.

주석에 대한 특정 요구 사항에 따라 요소 및 해당 유형을 사용자 정의할 수 있습니다. 

또한 사용 사례에 필요한 메타 주석(주석 속성)을 추가할 수 있습니다.

 

 

다음은 선택적 요소와 함께 JavaScriptMethod Annotation을 사용하는 예입니다.

@JavaScriptMethod(value = "performAction", count = 3, tags = {"tag1", "tag2"}, 
    enabled = true, level = JavaScriptMethod.Level.WARNING)
public void performAction() {
    // Method implementation
    System.out.println("Performing action...");
}


performAction() 메서드는 @JavaScriptMethod로 Annotation 처리됩니다. Annotation의 모든 선택적 요소에 대한 값을 지정합니다.

  1. value 요소는 "performAction"으로 설정되고,
  2. count 요소는 3으로 설정되고,
  3. tags 요소는 {"tag1", "tag2"}로 설정되고,
  4. enabled 요소는 true로 설정되고,
  5. level 요소는 JavaScriptMethod.Level.WARNING로 설정됩니다.

 

사용자지정 어노테이션을 사용할 때 요구 사항에 따라 선택적 요소의 값을 사용자 정의할 수 있습니다.

 

 

다음은 DTO에서 원하는 Method만을 뽑아 따로 어노테이션을 지정하고 javascript를 Java에 바인딩하는 예 입니다.

public V8Object exec(TestDTO rec, String js) {
    V8 runtime = new V8Object(this.runtime);
    V8Object v8obj = new V8Object(this.runtime);
    
    runtime.add("This", v8obj);
    this.registerMethods(runtime, v8obj, rec);

    return v8obj;
}

private void registerMethods(V8Object v8obj, Object obj) {
    Method[] methods = obj.getClass().getMethods();

    for (Method method : methods) {
        JavaScriptMethod annotation = method.getAnnotation(JavaScriptMethod.class);
        if (annotation != null) {
            String methodName = method.getName();
            if(annotation.level() == JavaScriptMethod.Level.WARNING) {
                v8obj.registerJavaMethod(obj, methodName, methodName, method.getParameterTypes());
            }
            else if(annotation.level() == JavaScriptMethod.Level.INFO) {
                // something..
            }
            else if(annotation.level() == JavaScriptMethod.Level.ERROR) {
                // something..
            }
        }
    }
}

 

반응형
반응형
최근에 달린 댓글