2017-12-29 16 views
-1

저는 작은 프로젝트를 만들고 있으며 현재 필요한 기능 중 하나를 달성하기 위해 노력하고 있습니다.특수 처리를 통해 추가 처리 추가

는 기본적으로 나는

을 좀하고 싶습니다 위의 메소드를 호출에, 그래서 내가, 인쇄 주석이 단지 추가 테스트를 인쇄 할

@PrintAnnotation 
public void print(){ 
    System.out.println("inside method"); 

주석 method.For 예를 호출하고있을 때, 메소드가 실행하려는

"Used print annotation" 
"Inside method" 

그게 전부입니다.

나는 annotation processor API를보고있다. 그러나 javadoc을 읽는 것을 제외하고는 어디에도 문서가 없다. 정확히 컴파일 만 이해하면 원래 클래스를 변경할 수 없으므로 추가하면된다.

는 또한 답변 반사를 사용하는 제안하지만,

처럼, 나는 코드를 검사하는 방법이 주석하는 경우 있음을 트리거 필요 반사를 사용하지만 프로그램의 모든 메소드에 추가하는 방법을 추가 할 필요가 그렇게 발견
public void print(){ 
    checkAnnotation(); 
    System.out.println("test"); 
} 

하지만 모든 클래스의 모든 메서드에서 한 줄에 수백 개가 아닌 주석 만 추가하면됩니다.

+0

Look into AOP ... – shmosel

+0

AOP 라이브러리를 사용하거나 리플렉션을 통해 명시 적으로 메소드를 호출하고 거기에 print 문을 삽입하지 않으면 이것이 가능하지 않다고 생각합니다. –

+0

정확히 이것을 필요로하고 특히 작업을위한 미리 준비 도구를 사용하지 않는 이유는 무엇입니까? –

답변

1

타사 라이브러리가없고 사용자 지정 코드가없는 "유일한 주석"을 통해 가능하지 않습니다.

주석은 주석일 뿐이며 다른 것은 없습니다.

즉, 해당 대상 (클래스, 방법, 필드 ...)에 Annotation의 존재를 감지하고 원하는 것을 수행 할 수있는 방법이 printcheckAnnotation이어야합니다. System.out.println("test"); 확실히 그렇게하지 않을 것입니다.

printcheckAnnotation 방법을 사용하는 경우 해당 방법으로 유틸리티를 만들고 System.out.println 대신 어느 곳에서나 print을 호출하십시오.

하지만 사실, 당신이 성취하려고하는 것은 AOP에 관한 것입니다. 사용자 정의 주석을 함께 사용할 수 있습니다.

그런 다음 질문을 spring 태그로 태그 지정 했습니까? 스프링을 사용합니까? 그것은 타사 라이브러리 집합이며 AOP 있습니다.

+0

주석이 단지 마커라는 것을 알았습니다. 그리고 나는 반사의 기초를 잘 가졌지 만, 다른 부분에 붙어 있습니다. 내가 각 method' 각 class' '에 대한 '그런 짓을 할 '경우 방법 = 방법에 annotated' '.call = doPrint()' 하지만 java에는 이벤트가 있으므로 다소 의아해합니다. – dac1n

+0

AOP를 확인해야합니다. '각 클래스에 대해 ... 각 메소드에 대해 ... '는 정말 나쁜 생각입니다 .-). 여전히, 호출자의 클래스 또는 메소드를 매개 변수로 전달하여 주석의 존재를 분석하는'Print' /'checkAnnotation' 메소드는 무엇입니까? – Vadim

+0

이것이 학교 과제라면 리플렉션을 사용하여 프록시 팩토리를 만들 수 있다고 생각합니다. 나는 이것이 당신의 제약이 유지되어야한다면 과제가 요구할 것이라고 생각한다. 그런 다음 "new"를 호출하지 않고 생성하려는 유형으로 전달하는 정적 프록시 팩토리에 대한 호출을 수행합니다. 이것이 학교 과제가 아니라면 바보가 될 것입니다. 특히 봄을 이미 사용하고 있다면 특히 그렇습니다. – Quaternion

관련 문제