18. februar 2006 - 22:43Der 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.
->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.
->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.
->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.
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.