문제

나는 팬이다 C++의 정적 메타프로그래밍.Java에는 이제 제네릭이 있다는 것을 알고 있습니다.이는 Java에서 정적 메타 프로그래밍(즉, 컴파일 타임 프로그램 실행)이 가능하다는 것을 의미합니까?그렇다면 이에 대해 자세히 알아볼 수 있는 좋은 자료를 추천해 줄 수 있는 사람이 있나요?

도움이 되었습니까?

해결책

아니요, 불가능합니다.제네릭은 템플릿만큼 강력하지 않습니다.예를 들어 템플릿 인수는 사용자 정의 유형, 기본 유형 또는 값이 될 수 있습니다.하지만 일반적인 템플릿 인수는 다음과 같습니다. Object 또는 그 하위 유형.

편집하다:이것은 오래된 답변입니다.2011년부터 Java 7이 출시되었습니다. 그러한 속임수에 사용될 수 있는 주석.

다른 팁

보세요 클로저.이는 JVM에서 실행되고 Java와 매우 상호 운용 가능한 매크로(메타 프로그래밍)가 포함된 LISP입니다.

"정적 메타프로그래밍"이란 정확히 무엇을 의미합니까?예, C++ 템플릿 메타프로그래밍은 Java에서는 불가능하지만 C++보다 훨씬 강력한 다른 방법을 제공합니다.

  • 반사
  • 관점 지향 프로그래밍(@AspectJ)
  • 바이트코드 조작(Javassist, ObjectWeb ASM, Java 에이전트)
  • 코드 생성(주석 처리 도구, Velocity와 같은 템플릿 엔진)
  • 추상 구문 트리 조작(인기 IDE에서 제공되는 API)
  • Java 컴파일러를 실행하고 런타임에도 컴파일된 코드를 사용할 수 있음

가장 좋은 방법은 없습니다.각 방법에는 장점과 단점이 있습니다.JVM의 유연성으로 인해 Java의 모든 메소드는 컴파일 시간과 런타임 모두에서 사용될 수 있습니다.

아니요.게다가 제네릭 유형은 컴파일러에 의해 상한까지 지워지므로 런타임에 제네릭 유형 T의 새 인스턴스를 만들 수 없습니다.

Java에서 메타프로그래밍을 수행하는 가장 좋은 방법은 유형 삭제를 피하고 Class<T> 당신의 유형 T의 물건.하지만 이것은 단지 해킹일 뿐입니다.

아니요, Java의 제네릭은 순전히 Object 캐스팅을 방지하는 방법입니다.

Java에 대한 강력한 컴파일 타임 논리가 필요한 경우 이를 수행하는 한 가지 방법은 일종의 코드 생성을 사용하는 것입니다.다른 포스터에서 지적했듯이 Java 언어는 컴파일 타임 로직을 수행하는 데 적합한 기능을 제공하지 않으므로 이것이 최선의 선택일 수 있습니다(컴파일 타임 로직이 실제로 필요한 경우).다른 가능성을 모두 소진하고 나면 확신하는 코드 생성을 원하신다면 제 오픈 소스 프로젝트인 Rjava에 관심이 있으실 것입니다. 다음 위치에서 이용 가능합니다.

http://www.github.com/blak3mill3r

Ruby on Rails 애플리케이션용 Google Web Toolkit 인터페이스를 자동으로 생성하기 위해 작성한 Ruby로 작성된 Java 코드 생성 라이브러리입니다.그것은 매우 편리한 것으로 판명되었습니다.

경고하자면, Rjava 코드를 디버깅하는 것은 매우 어려울 수 있습니다. Rjava는 많은 검사를 수행하지 않으며 단지 사용자가 수행 중인 작업을 알고 있다고 가정합니다.어쨌든 그것은 정적 메타 프로그래밍의 상태와 거의 같습니다.C++ TMP를 사용하여 수행하는 사소한 작업보다 디버깅하기가 훨씬 쉽고 동일한 종류의 작업에 사용할 수 있다고 말하고 싶습니다.

어쨌든, Java 소스 코드를 출력하는 프로그램 작성을 고려 중이라면 지금 당장 중단하고 Rjava를 확인하십시오.아직 원하는 대로 되지 않을 수도 있지만 MIT 라이선스이므로 자유롭게 개선하거나 튀기거나 할머니에게 팔 수 있습니다.일반 프로그래밍에 경험이 있는 다른 개발자가 디자인에 대해 의견을 제시할 수 있게 되어 기쁩니다.

아주 축소된 의미로 보면 아마도요?http://michid.wordpress.com/2008/08/13/type-safe-builder-pattern-in-java/

롬복 약한 형태의 컴파일 타임 메타 프로그래밍을 제공합니다.그러나 그들이 사용하는 기술은 완전히 일반적인.

보다 컴파일 타임에 Java 코드 변환 관련된 토론을 위해

정적 메타 프로그래밍의 이점을 이해하고 있는지 잘 모르겠습니다.

Java에서는 클래스에 대한 정보를 찾고 메타 프로그래밍이 수행하는 모든 작업을 수행할 수 있습니다. 새로운 구문이나 다양한 사고 방식을 추가하지 않고도 코드 내에서 해당 작업을 수행할 수 있습니다.주석은 또한 보다 구조화된 방식으로 특정 메타 프로그래밍 작업을 수행할 수도 있습니다.

제가 틀렸을 수도 있습니다. 잘 이해가 되지 않아서 질문을 여는 것을 진지하게 고려하고 있습니다.정적 메타 프로그래밍은 일부 언어가 런타임에 사용할 수 있는 많은 컴파일 타임 정보를 유지하지 않는다는 사실(Java 및 동적 언어의 장점 중 하나)을 우회하는 깔끔한 해킹처럼 보입니다.

메타 프로그래밍이 반영보다 더 이해하기 쉽고 읽기 쉬우며 더 나은 솔루션을 제공하는 예제에 대한 링크를 누구든지 회신할 수 있다면 그 노력에 감사하겠습니다.

그만큼 매니폴드 프로젝트 유형 안전을 제공합니다 공전 자바용 메타프로그래밍.Javac이 유형 이름을 확인하므로 이를 사용하여 컴파일 타임에 동적으로 유형을 빌드할 수 있습니다.그만큼 JSON 스키마 데모 동적 컴파일 타임 유형 프로젝션(코드 생성 빌드 단계 없음) 측면에서 정적 메타프로그래밍을 보여줍니다.

또한 매니폴드를 사용하여 새로운 기능을 추가할 수 있습니다.확인해 보세요 구조적 타이핑, 메소드 확장, 그리고 유형 안전 반사. .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top