2012-01-12 3 views
1

Привет всем, мне было интересно, могу ли я изменить и перекомпилировать базовый класс Java?Как мы можем изменить исходные классы Java?

Я хотел бы добавить функции к существующим классам и иметь возможность вызывать эти функции.

Например, я хотел бы добавить функцию java.lang.String, перекомпилировать его и использовать его для моего проекта:

public char[] getInternalValue(){ 
     return value; 
} 

мне было интересно, как же нам идти о делать это?

+4

Не лучше ли писать собственные реализации (классы полезности), а не воспроизводить существующие классы. –

+1

Что вы пытаетесь сделать, добавив методы в существующие классы? Существует, безусловно, лучшее решение того, что вы пытаетесь сделать. – casablanca

+0

@casablanca Например, я хочу получить доступ к закрытым полям класса ('java.lang.String.value') – Pacerier

ответ

2

Что вы имеете в виду, называется "monkey patching". Это возможно на Java, но это нецелесообразно, и результаты могут быть ... интересны. Вы можете загрузить исходный код для класса струнного, вытолкнуть его в баночку и предварять с загрузочным путем к классам:

-Xbootclasspath/p:MonkeyPatchedString.jar 

заменить встроенный класс Струнного с вашим собственным.

Есть интересная статья по этому вопросу here.

+0

Это мощный = D – Pacerier

+1

«С большой силой приходит большая ответственность» - дядя Бен – ninesided

+0

Источник находится в JDK. Вы также можете добавить JAR в одобренный каталог. –

1

Не делайте этого.

Если вы хотите быть злым, вы можете использовать отражение для доступа к массиву байтов строки. Но, конечно, нет никакой гарантии, что эта область будет существовать в будущем, как ... нормально, это, вероятно, будет, но предупредить emptor.

2

Если вы это сделаете, вы получите несовместимый с классом java.lang.String и со всеми классами, полагаясь на java.lang.String, что очень, очень редко является хорошей идеей.

Второй проблемой может быть лицензия. Для самостоятельного изучения это прекрасно, но если вы публикуете свой код (скомпилированный или в исходном коде), вы должны внимательно ознакомиться с условиями лицензии.

Поскольку класс String объявлен окончательным, вы даже не можете наследовать от String и реализовать свою PacerierString, которая кажется полезной с первого взгляда. Но есть так много людей, которые бы реализовали своих маленьких помощников, и мы получили бы множество классов SpecialString со всех сторон.

Обычной практикой было бы людей, написание класса Foo, и добавление метода

public Foo toFoo() { 
    // some conversion for String representation of Foo 
} 

их UniversalToolString.

Вы можете, однако, написать Wrapper, который содержит строку. Вы не можете передать свой Wrapper методу, который ожидает String, но вам нужно будет вызвать его метод toString(), если это окажется хорошим кандидатом для этой цели.

Foo foo = new Foo ("foobar", 42); 
    foo.setMagic (foo.toString().length); 
Смежные вопросы