할 수 있는 방법을 제공 java.util.임의 특정 씨앗에서 타사 클래스가?

StackOverflow https://stackoverflow.com/questions/106623

  •  01-07-2019
  •  | 
  •  

문제

나는 Java 프로그램을 로드하는 타사 클래스 파일(클래스를 작성하지 않은)실행합니다.이러한 클래스를 종종 사용 java.util.Random, 는 기본적으로 생성하는 임의의 시작 초기값을 모든 시간을 가져옵니다.의 이유로 reproducability 를 주고 싶 이러한 클래스 같은 시작 씨마,그것을 변경하에서만 나의 재량에 따릅니다.

여기에 몇 가지의 명백한 솔루션이며 왜 그들이 작동하지 않:

  1. 을 사용하여 다른 임의의 클래스에서 타사 classfiles.문제가 여기에 내가 만드는 클래스 파일을 수정할 수 없습니다.

  2. 사용자 지정더 로드하는 우리 자신의 임의의가 아닌 클래스의 JVM 의 버전입니다.이러한 접근방식을 작동하지 않기 때문에 자바도록 허용하지 않 classloaders 을 재정의 클래스 java 패키지입니다.

  3. 교환 rt.jar ko java.util.Random 구현을 위해 우리 자신의 두고 있는 파일로 신뢰할 수 있는 위치에 대한 JVM.이러한 접근 방식이 필요 응용 프로그램의 사용자 덤비는 JVM 설치,자신의 컴퓨터에는 좋지 않습니다.

  4. 추가 사용자 정의 java.util.Random 클래스 bootclasspath.이 기술적으로 작동이 특정 응용 프로그램,그것은 불가능하기 때문에 이 응용 프로그램을 사용한 최종 사용자에서 실행됩니다.만들고 싶다는 응용 프로그램을 실행한 사용자,즉 강제로 그들을 설정한 자신의 bootclasspath 습니다.나는 숨길 수 없는 이 스크립트에서이기 때문에,그것은 의도하에서 실행할 수 있습니다 IDE 다음과 같 Eclipse(쉽게 디버깅할 수 있습니다.)

그래서 이렇게 하려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

고려할을 수정하여 타사 라이브러리가 그들을 사용하여 보 그들의 임의의 인스턴스가 있습니다.를 하지 않은 경우에는 소스 코드를 편집할 바이트 코드 그것을 할 수 있습니다.하나의 도움이 toolkit for 하는 ASM.

다른 팁

귀하의 옵션 2 이 실제로 작동한 다음과 같은 방향입니다.

당신이 필요합니다(로 anjab 말했)변경이트 스트랩 클래스 경로.

에서 명령행 프로그램의 추가해야 하는 다음과 같다:

java Xbootclasspath/p:C:\your andom_impl.jar YourProgram

에 있어 가정 Windown 기계 또는 경로는 그 문제에 대한 모든 OS 에서.

해당 옵션을 추가한 클래스에 jar 파일전 rt.jar 가 로드되어 있습니다.그래서 당신의 랜덤 로드되기 전에 rt.jar Random 클래스는 않습니다.

사용이 표시 입력하여:

java -X

그것을 모두 표시하 X(tra)기능 de JVM.수여 사용할 수 없 에 다른 VM 구현 등 JRockit 또는 다른 하지만 그것은 거기에 태양 JVM.

-Xbootclasspath/p:앞에 추가로서의 앞 부트스트랩 클래스 경로

나는 이러한 접근 방식을 사용 응용 프로그램에서는 기본 오브 클래스로 대체해야 다른 사람들과 구를 구현합니다.오브 클래스는 Java 핵심지지 않습니다 문제입니다.

행운을 빕니다.

당신이 사용할 수 있습 AOP 을 차단하기 위해 통화를 임의의 및 트위 arg 당신이 무엇을 원합니다.

Sam

할 수 있지만 변하지 않는 클래스 로더 사소한"java.x"과"일.x"패키지를 하는 방법이 있다고 생각 클래스 로딩(고 설치하는"수업 후에었 bytecoded 로드"수신기)논문의 클래스,그래서 당신은 설정할 수 있습 같은 것을 후손을 로드하는 클래스에서는 이러한 패키지입니다.힌트:사용 반영합니다.

어쨌든,한이 없 추가 정보를 정확히 무엇을 달성하고 싶은,그것은 매우 단단하는 데 도움 당신은 여기에.

P.S.:알고 있는"static{}"-블록을 방해할 수 있습니다 당신이 장난으로 씨앗,다시합니다.

"사용자 지정더 로드하는 우리 자신의 임의의가 아닌 클래스의 JVM 의 버전입니다.이러한 접근방식을 작동하지 않기 때문에 자바도록 허용하지 않 classloaders 을 재정의 클래스에서 자바 패키지입니다."

얼마나 변화에 대해 bootclasspath 사용하는 사용자 정의 임의의 등?

BR, 요.

예 option2 동:만든 두 개의 클래스에 대한 테스트라는 용도 ThirdPartyClass.javaRandom.java

만들어 병에서 ThirdPartyClass.class

jar -cvf tpc.jar ThirdPartyClass.class

만들어 병에서 Random.class

jar -cvf rt123.jar Random.class

후 실행하는 다음과 같은 명령을 사용:

java  -Xbootclasspath/p:tcp.jar:rt123.jar -cp . -verbose ThirdPartyClass

출력은 다음과 같습니다. seed value for ThirdPartyClass-> 1

소스 코드 ThirdPartyClass.java----->

import java.util.Random;

public class ThirdPartyClass {
    ThirdPartyClass(long seed ) {
        System.out.println("seed value for ThirdPartyClass-> "+seed);
    }   

    public static void main(String [] args) {
        ThirdPartyClass tpc=new ThirdPartyClass(new Random().nextLong());
    }
}

소스 코드 Random.java------->

package java.util;

import java.io.Serializable;

public class Random extends Object implements Serializable
{
    public Random() {
    }

    public Random(long seed) {
    }

    public long nextLong() {
        return 1;
    }
}

감사 Mahaveer 계면 사악한 말리

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