Как я могу дать java.util. Случайный определенное семя в сторонних классах?

Я считаю, что это самый быстрый запрос, который отвечает на ваш вопрос, потому что он не использует интерпретированное предложение $where:

{$nor: [
    {name: {$exists: false}},
    {name: {$size: 0}},
    {name: {$size: 1}}
]}

Это означает «все документы, кроме тех, которые не имеют имени (либо несуществующий или пустой массив) или только с одним именем. "

Тест:

> db.test.save({})
> db.test.save({name: []})
> db.test.save({name: ['George']})
> db.test.save({name: ['George', 'Raymond']})
> db.test.save({name: ['George', 'Raymond', 'Richard']})
> db.test.save({name: ['George', 'Raymond', 'Richard', 'Martin']})
> db.test.find({$nor: [{name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}}]})
{ "_id" : ObjectId("511907e3fb13145a3d2e225b"), "name" : [ "George", "Raymond" ] }
{ "_id" : ObjectId("511907e3fb13145a3d2e225c"), "name" : [ "George", "Raymond", "Richard" ] }
{ "_id" : ObjectId("511907e3fb13145a3d2e225d"), "name" : [ "George", "Raymond", "Richard", "Martin" ] }
>
5
задан adum 20 September 2008 в 18:29
поделиться

6 ответов

Полагайте, что изменение сторонних библиотек сделало, чтобы они использовали видевший их Случайные экземпляры. Хотя у Вас нет исходного кода, можно, вероятно, отредактировать байт-код, чтобы сделать это. Один полезный инструментарий для того, чтобы сделать такой является ASM.

2
ответ дан 14 December 2019 в 09:05
поделиться

Ваша опция 2 будет на самом деле работать со следующими направлениями.

Вам будет нужно (как anjab сказал) изменить путь к классу начальной загрузки.

В командной строке программы необходимо добавить следующее:

java-Xbootclasspath/p:C:\your\random_impl.jar YourProgram

Принятие Вы находитесь на машине Windown или пути в этом отношении в любой ОС.

Та опция добавляет классы в файлах банки, прежде чем rt.jar будут загружены. Таким образом, Ваше Случайное будет загружено, прежде чем rt.jar Случайный класс делает.

Использование отображено путем ввода:

java -X

Это отображает все X (tra) функций de, JVM имеет. Это май не доступный на других реализациях VM, таких как JRockit или другой, но это находится там на Sun JVM.

- Xbootclasspath/p: предварительно ожидайте перед путем к классу начальной загрузки

У меня есть использование этот подход в приложении, где класс ШАРА по умолчанию должен быть заменен реализацией ШАРА других. Класс ШАРА является частью Ядра Java и никогда не имел проблемы.

Удачи.

3
ответ дан 14 December 2019 в 09:05
поделиться

"Используйте пользовательский classloader для загрузки нашего собственного Случайного класса вместо версии JVM. Этот подход не будет работать, потому что Java не позволяет classloaders переопределять классы в пакете Java".

как насчет того, чтобы изменить bootclasspath для использования пользовательского Случайного класса?

BR, ~A

0
ответ дан 14 December 2019 в 09:05
поделиться

Хотя Вы не можете изменить classloader тривиально для "java.x" и "sun.x" пакетов, существует способ счесть загрузку класса (и устанавливать "после того, как класс был bytecoded и загрузил" слушателя) классов тезисов, таким образом, Вы могли установить что-то как семя после загрузки классов от этих пакетов. Подсказка: Используйте отражение.

Так или иначе пока у меня нет дальнейшей информации, чего точно Вы хотите достигнуть, довольно трудно помочь Вам здесь.

P.S.: знайте, что "статичный {}" - блоки могут препятствовать Вам бездельничающий с семенами, снова.

1
ответ дан 14 December 2019 в 09:05
поделиться

Вы могли использовать AOP, чтобы прервать вызовы к Случайному и вертеть аргумент к тому, что Вы хотите.

Sam

1
ответ дан 14 December 2019 в 09:05
поделиться

Да, вариант 2 работает: создал два класса для целей тестирования с именами ThirdPartyClass.java и Random.java

создал jar из ThirdPartyClass.class

jar -cvf tpc.jar ThirdPartyClass.class

создал jar из Random.class

jar -cvf rt123.jar Random.class

после этого выполните следующую команду:

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

Результатом будет: начальное значение для 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;
    }
}

Спасибо Махавир Прасад Мали

0
ответ дан 14 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: