할 수 있는 방법을 제공 java.util.임의 특정 씨앗에서 타사 클래스가?
-
01-07-2019 - |
문제
나는 Java 프로그램을 로드하는 타사 클래스 파일(클래스를 작성하지 않은)실행합니다.이러한 클래스를 종종 사용 java.util.Random
, 는 기본적으로 생성하는 임의의 시작 초기값을 모든 시간을 가져옵니다.의 이유로 reproducability 를 주고 싶 이러한 클래스 같은 시작 씨마,그것을 변경하에서만 나의 재량에 따릅니다.
여기에 몇 가지의 명백한 솔루션이며 왜 그들이 작동하지 않:
을 사용하여 다른 임의의 클래스에서 타사 classfiles.문제가 여기에 내가 만드는 클래스 파일을 수정할 수 없습니다.
사용자 지정더 로드하는 우리 자신의 임의의가 아닌 클래스의 JVM 의 버전입니다.이러한 접근방식을 작동하지 않기 때문에 자바도록 허용하지 않 classloaders 을 재정의 클래스
java
패키지입니다.교환 rt.jar ko
java.util.Random
구현을 위해 우리 자신의 두고 있는 파일로 신뢰할 수 있는 위치에 대한 JVM.이러한 접근 방식이 필요 응용 프로그램의 사용자 덤비는 JVM 설치,자신의 컴퓨터에는 좋지 않습니다.추가 사용자 정의
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.java
고 Random.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 계면 사악한 말리