2010-03-03 3 views
4

안녕하세요, 저는 처음으로 실제 직업 기회 (흥미 진진한)를 가진 대학 수석입니다. 이제는 프로그래밍 예제를 볼 필요가있는 단계에 있으며, Java에서 난수 생성기 서비스를 구현하는 작업을 두 가지 다른 구현 방식으로 제공합니다 (하나는 기본 제공 항목을 사용하고 다른 하나는 선택 항목) . 코드는 쉬운 부분이지만, 작업의 한 부분이 나를 혼란 ... 여기있다 : 후보로 내 자신의 프로젝트를 컴파일Java에서 다시 컴파일하지 않고 구현을 추가 하시겠습니까?

평가자로

, 나는 다음을 수행 할 수 있어야한다 jar 파일. 내 솔루션을 candidate executable executable jar로 등록하십시오. 후보 실행 파일 jar를 실행합니다. 어떻게 든 내 구현을 실행하도록 알려줍니다.

내가 실행의 .jar로 내 코드를 만들고있어 기본적으로

평가자 자신의 난수 생성기 구현에 플러그 후보에 의해 개발 된 코드와 컴파일 된 클래스를 사용할 수 있어야합니다 응시자의 코드를 다시 컴파일하지 않아도됩니다.

도대체 무슨 뜻입니까? 어쩌면 나는 명백한 것을 놓친 것일까? 나는 모든 것을 다시 컴파일 할 필요없이 어떻게 구현할 수 있을지 모르겠다 ... 나는 내 대학에서 그런 식으로 들어 본 적이 없기 때문에 너무 큰 일은 아니기를 바란다. .

도움/의견을 보내 주시면 감사하겠습니다.

+4

을보십시오. http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html –

+0

@ Joachim : Shouldn 코멘트가 아니라 대답일까요? –

+0

@Aaron : 아마도 ... 1 개로 만들 수 있습니다 .-) –

답변

10

저는 이것이 평가자가 구현할 수있는 공개 API의 일부로 RandomNumberGenerationStrategy 인터페이스를 제공해야한다는 것을 의미한다고 생각합니다.

그런 다음 인터페이스의 특정 구현을 등록 할 수있는 또 다른 후크를 제공합니다. 그런 다음 콜백을 통해 호출합니다.

+2

-DRandomNumberStrategy = my.own.random.impl.MyGenerator와 같은 간단한 vm 인수는이 기능을 제공합니다. 자체 코드의 값을 사용하여 인스턴스화하고 실행할 수 있습니다. – Robin

+0

@Robin 심지어 더 나은 ... commons-discovery를 사용하여 인스턴스화하고 실행합니다. –

+0

아이디어를 주셔서 감사합니다. 오늘 밤 확실히 살펴 보겠습니다. 빠른 질문/설명 : "등록"이란 정확히 무엇을 의미합니까? 간단하게 방법을 찾아 주 구현 클래스를 사용하도록 주요 호출 클래스에 알릴 수 있습니까? commons-discovery 부분에 대해서는 기본적으로 JRE와 함께 번들로 제공되는 도구 만 사용하기 때문에 인터페이스가 이동하는 방법 일 수 있습니다. –

5

그들은 URLClassLoader (see the docs)으로 구현 JAR을로드 한 다음 리플렉션을 사용하여 기본 클래스를 인스턴스화하고 올바른 메소드를 호출하여 난수 생성기를 호출하기를 원합니다.

1

Spring을 사용하고 ClassPathXmlApplicationContext을 사용하면 구현을 스프링 구성으로 바꿀 수 있습니다. Spring 설정은 다음과 비슷해야합니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 

<beans> 
    <bean id="randonNumberGenerator" class="com.me.MyGenerator"/> 

    <!-- 
    <bean id="randonNumberGenerator" class="com.someoneelse.ADifferentGenerator"/> 
    --> 
</beans> 

프로그램에서 Spring 컨텍스트를로드하고 bean을 검색하십시오.

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"}); 
IGenerator generator = applicationContext.getBean("randonNumberGenerator"); 

// IGenerator in the interface which MyGenerator and ADifferentGenerator implement 

는 Spring 설정 파일을 클래스 패스에 존재한다 기억 (단지 당신의 항아리 내부) 그래서 다시 컴파일하지 않고 런타임에 변경 될 수 있습니다.

+0

흠, 흥미 롭습니다. Spring은 인터뷰 중 하나에서 Spring 프레임 워크를 사용하는 방법에 대해 언급했기 때문에이 부분을 확인해 보도록하겠습니다. 감사합니다. –

0

이 사용하는 OSGi framework을 살펴보십시오. 예를 들어, Eclipse는 새로운 플러그인을로드하고 즉시 실행 환경에 삽입하여 재시작없이 적용 할 수 있습니다. 당신도 똑같이 할 수 있습니다.

+0

음 ... 그들은 서비스의 핫 스와핑 (hot swapping)을위한 엔터프라이즈 환경이 아니라 간단한 것을 요구하고 있습니다. Kevin Pauli와 Aaron이 제안했듯이, 반사와 전략 패턴으로 충분할 것입니다. – helios

0

가능한 한 더 간단하게 만드는 것이 좋겠지 만 구현해야하는 클래스 및 메서드 프로토 타입의 이름을 제공하지 않았습니까? 이걸 가장 논리적이고 직접적인 방법이라고 생각합니다.우리 학교의 교수가 우리에게 약간의 과제를 주었을 때처럼 그가 제공 한 드라이버 클래스로 프로그램을 실행할 수 있어야한다고 요구할 때 그는 보통 우리가 구현해야하는 클래스의 이름을 메소드의 프로토 타입과 함께 설정합니다. . 그냥 생각 ...

+0

아니요, 그들은 방금 "난수 생성기 서비스 구현"이라는 두 가지 방법을 사용했습니다. 하나는 내장 된 Java 도구 (Random, SecureRandom 등)를 사용하고 하나는 선택 알고리즘을 사용하고 또 다른 하나는 평가자를 허용하는 것입니다. 구현을 추가하기 위해 불행히도 이름이 지정되지 않았습니다. –