문제

Java에서는 응용 프로그램이 실행중인 동안 즉시 클래스 정의를 생성 한 다음 해당 클래스의 객체를 만들 수 있습니까?

예를 들어, 실행중인 응용 프로그램은 새 클래스에 포함 할 클래스 멤버 목록이 포함 된 텍스트 파일로 읽습니다. 그런 다음 응용 프로그램은 멤버 목록을 기반으로 클래스 정의를 정의한 다음이를 무행으로 정의합니다.

도움이 되었습니까?

해결책

예 이론적으로 그렇게 할 수 있습니다. 클래스 파일은 바이트 코드입니다. 그런 다음 메소드 DefineClass (String, Byte [], int, int)를 사용하여 반사를 통해 개체를 인스턴스화하는 데 사용할 수있는 클래스 인스턴스를 얻을 수 있습니다.

실제로 당신은 같은 것을 사용할 수 있습니다 cglib 또는 Javaassist.

파일에서 Java 코드를 생성하고 컴파일러를 호출 한 다음 파일을로드하는 긴 길을 사용할 수도 있습니다.

다른 팁

사용을 사용하여 클래스를 동적으로 생성 할 수 있습니다 ASM

새 클래스에 대한 코드를 파일에 작성한 다음 해당 파일의 Java 컴파일러를 호출하고 클래스 로더를 사용하여 해당 클래스를 실행중인 애플리케이션에 동적으로로드 하여이 작업을 수행 할 수 있습니다. Apache Tomcat은 JSP 페이지를 위해이 작업을 수행합니다. 코드가 필요하고, 일부를 변경하고, 클래스 중간에 시도/캐치 블록으로 랩핑 한 다음 파일 시스템에 쓰고, 컴파일하고, 클래스 로더를 사용하여 요청을 제공하기 위해 고소합니다.

물론 가능합니다. 예를 들어 이것을 참조하십시오 기사.

아마도 가장 간단합니다 솔루션 (추가 라이브러리가 필요하지 않음)은 다음과 같습니다. Java 컴파일러 API Java 6과 함께 제공됩니다.

아마도 약간 과잉 일 것입니다 아파치 Bcel (바이트 코드 엔지니어링 라이브러리)를 사용하여 생성 할 수 있습니다. class 런타임 동안 파일.

내가 직접 시도하지는 않았지만, 아마도 클래스를 만들고로드하고 런타임에 인스턴스화 할 수 있습니다.

예, 가능합니다.

당신은 함께 수업을 만들 수 있습니다 Javassist 클래스의 본문을 정의하고 Javassist가 새 클래스를 편집하게하여 런타임에.

Javassist에는 클래스의 정의를 기반으로 바이트 코드를 생성하는 사용자 정의 컴파일러가 있습니다. 사물을 처리하는 몇 가지 특별한 방법이 있지만이 라이브러리를 사용하는 것은 매우 쉽고 직관적입니다.

Javassist는 Jboss에서 사용되며, 그것이 좋은 참조라고 생각합니다 :)

동일하게 달성 할 수 있습니다 Bcel, 그러나 훨씬 더 어렵습니다 (그러나 이런 식으로 생성되는 내용을 더 많이 제어 할 수 있습니다).

당신은 아마도 Jruby, Jpython 또는 Groovy와 비슷한 일을 할 수 있습니다.

특히 마조히즘을 느끼고 있다면 볼 수 있습니다 Bcel.

Java 및 Metaprogramming을 원한다면 사용하십시오 그루비.

ASM Java의 가장 낮은 레벨 바이트 코드 라이브러리입니다. 그것은 매우 어렵지만 매우 강력합니다. ASM의 문서를 읽는 것이 좋습니다 (PDF) Java의 바이트 코드 생성이 어떻게 작동하는지 이해합니다. 이 문서는 또한 클래스 로더에 바이트 코드를로드하는 방법 (올바르게 수행 할 또 다른 어려운 주제)을 설명합니다.

그 후에는 더 높은 수준의 라이브러리 중 하나를 사용하여 인생이 더 쉬워지고 그들이하는 일을 이해할 수 있습니다. 프록시 생성과 같은 많은 경우 cglib 유용하고 사용하기 간단합니다. 더 많은 힘을 위해 많은 사람들이 언급했습니다 Javassist (나는 그것을 사용하지 않았다 -Cglib와 ASM은 나에게 좋았습니다).

여기에는 최근 질문이있었습니다 메모리 내 컴파일 소스 코드를 생성 한 후해야 할 일에 대한 힌트를 제공해야합니다.

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