There are certain limitations and restrictions when modifying the system classes. Here is what works:
Your aspect: public privileged aspect StringUtils { public String String.ltrim() { return "test ltrim"; } } Apply that to the JVM classes: ajc -inpath rt.jar StringUtils.java -outjar newrt.jar (rt.jar being the windows jar containing String) Your main class: public class Main { public static void main(String []argv) { String string = "ABCDEFG"; string = string.ltrim(); System.out.println(string); } } Compiling it: javac -Xbootclasspath/p:newrt.jar Main.java (need the newrt ahead of the regular rt, hence the -X) Running it: java -Xbootclasspath/p:newrt.jar Main test ltrim Basically load time weaving isn't going to work for you as these classes get loaded early on and by a loader that doesn't get a weaver attached to it - so we go with compile time weaving. Because we are compile time weaving we have to ensure our woven classes are used instead of those the JVM would ordinarily use (-Xbootclasspath/p where p is for prefix). I can't comment on the legality of it, but I perhaps wouldn't advise shipping a product that included a modified set of classes like this. But it can be done. cheers, Andy On 7 June 2012 10:17, MattOng <on...@yahoo.com> wrote: > > From what I can see in sample code: > > public class Point{} > > public aspect Point > { > // a new method is introduced into the Point Class. > public String Point.toLongString(){ > return "### FROM ASPECT ###"; > } > } > > public class Main{ > public static void main(String[] args){ > Point p1 = new Point(); > > // This line below works without any error. > System.out.println("p1.toLongString =" +p1.toLongString()); > System.out.println("p1 =" + p1); > } > } > > --------------------------------------------------------------- > However, when I tried this, it does not work > > // Extends the String class and provide other useful > public privileged aspect StringUtils { > > public String java.lang.String.ltrim(){ > return "TEST LTRIM"; > } > > public String java.lang.String.rtrim(){ > return "TEST RTRIM"; > } > > } > > public class Main { > public static void main(String[] args) { > String string="ABCDEFG"; > // Complians with the error shown below > string=string.ltrim(); > System.out.println(string); > } > } > > --------------------------------------------------------- > Exception in thread "main" java.lang.NoSuchMethodError: > java.lang.String.ltrim()Ljava/lang/String; > at > stringext.StringUtils.ajc$interMethodDispatch1$stringext_StringUtils$java_lang_String$ltrim(StringUtils.aj) > at stringext.Main.main(Main.java:11) > ---------------------------------------------------------- > > Please help to show how this can be done properly. Many thanks in advance. > > > -- > View this message in context: > http://aspectj.2085585.n4.nabble.com/How-to-add-methods-to-java-lang-String-tp4650376.html > Sent from the AspectJ - users mailing list archive at Nabble.com. > _______________________________________________ > aspectj-users mailing list > aspectj-users@eclipse.org > https://dev.eclipse.org/mailman/listinfo/aspectj-users _______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users