Avatar billede jespersahner Nybegynder
18. februar 2006 - 22:43 Der er 11 kommentarer og
1 løsning

Modificere klasser i java.lang.*

Er det muligt på en nem måde at modificere klasserne i java.lang.*?

Jeg har forsøgsvis prøvet at ændre System (kildekoden System.java findes i filen src.zip i JDK'en) på flg. måde:
- Metoden currentTimeMillis() er ændret fra:
  public static native long currentTimeMillis();
  til:
  public static long currentTimeMillis() {
      return 0L;
  }
- System.class er fjernet fra rt.jar og den nye version er tilføjet

Når jeg herefter eksekverer 'java', får jeg flg. fejlmeddelelse:
Error occurred during initialization of VM
java.lang.NoSuchMethodError: java.lang.System.currentTimeMillis()J
(der står faktisk 'J' til sidst)

Klassen System genkendes altså formentlig, men metoden currentTimeMillis() findes ikke.

Burde det ikke virke?
Avatar billede arne_v Ekspert
19. februar 2006 - 00:02 #1
umiddelbart synes jeg at det burde virke

det er saa vidt jeg ved en overtraedelse af licensen

og jeg har aldrig proevet selv

http://forum.java.sun.com/thread.jspa?threadID=644202&messageID=4070128
Avatar billede kalp Novice
19. februar 2006 - 10:52 #2
Har du prøvet, at kopire metoden over i en seperatklasse? bare for, at se om det virker.
Avatar billede jespersahner Nybegynder
19. februar 2006 - 14:14 #3
->kalp: Ja, og min modificerede udgave af System kompileres da også uden fejl. Men som Arne skriver, er det sikkert overtrædelse af licensen, så jeg skal nok finde på noget andet. Formålet er egentlig blot afdække, om man på en nem måde kan "customisere" i forhold til java.lang.* uden at den øvrige kode skal ændres, men der er sikkert også et sikkerhedsmæssigt aspekt her, som er relevant.
Avatar billede arne_v Ekspert
20. februar 2006 - 00:19 #4
du kan extende standard klasser

du kan saagar selv lave kode i java.lang package hvis du angiver jar filen
i java command line med -Xbootclasspath

men kode som du ikk ehar kontrol over bruger jo standard klasserne
Avatar billede jespersahner Nybegynder
20. februar 2006 - 01:29 #5
->arne_v: Ganske interessant med optionen -Xbootclasspath. Jeg troede ikke, at man af sikkerhedshensyn på den måde kunne dressere bootstrap-classloaderen til at loade klasser før rt.jar. Vil det ikke giver sikerhedsmæssige problemer, hvis specielt String-klassen erstattes, da String jo er uforanderlig?

Ved en hurtig test kan jeg "højest" fremprovokere samme fejl som ovenfor, når jeg ikke retter i rt.jar, men føjer min egen udgave af (java.lang.)System til classpath vha. -Xbootclasspath.
Avatar billede arne_v Ekspert
20. februar 2006 - 01:39 #6
du vaelger eksplicit at give noget kode bootclasspath status => ikke
noget sikkerheds problem som saadan
Avatar billede arne_v Ekspert
20. februar 2006 - 01:44 #7
men tilbage til dit problem

http://www.theserverside.com/news/thread.tss?thread_id=24446

(laes lidt ned - den starter med noget helt andet, men kommer til det du vil)
Avatar billede jespersahner Nybegynder
20. februar 2006 - 02:19 #8
->arne_v: Ganske pudsigt er det tilfældigvis samme klasse/metode, der her nævnes.

Som jeg læser det, kommer de ikke frem til en løsning men antyder, at der kan være noget med native og registerNatives(), hvilket jeg ikke umiddelbart forstår. Gør du?
________________________________

Til min egen log-bog:
Replace java.lang.System class
Posted by: Aymeric Alibert on March 15, 2004 in response to Message #113970 1 replies in this thread

    As I understand it must be no problems to change native method to a non native, doe's jvm throws linker error if you drop "native" modifier ?


When switching to non native, I get

Error occurred during initialization of VM
java.lang.NoSuchMethodError: java.lang.System.currentTimeMillis()J

My interpretation is that the System class calls registerNatives() which register the currentTimeMillis method. Since a method with that signature is registered, you cannot create a non native version of currentTimeMillis with the same signature.
Avatar billede jespersahner Nybegynder
20. februar 2006 - 02:36 #9
->arne_v: Jeg har prøvet at fjerne flg. stump i System-klassen:

/* First thing---register the natives */
private static native void registerNatives();
static {
    registerNatives();
}

- og jeg får så flg. fejlmeddelelse i stedet for:
Error occurred during initialization of VM
java.lang.ExceptionInInitializerError
Avatar billede jespersahner Nybegynder
20. februar 2006 - 02:39 #10
->arne_v: ..men så er der måske noget med, at de øvrige native-erklærede metoder ikke virker osv. (?) Hmmm..
Avatar billede jespersahner Nybegynder
03. marts 2006 - 17:21 #11
->arne_v: Skal vi ikke holde her. Smid gerne et svar.
Avatar billede arne_v Ekspert
03. marts 2006 - 17:42 #12
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester