Re: Question: what version of jdk is bcel 5.1 expected to be run with?
Claudio Corsi <[email protected]>
| Newsgroups | gmane.comp.jakarta.bcel.devel |
|---|---|
| Organization | ObjectStore - A Division of Progress Software |
| Message-ID | <[email protected]> |
Thomas Hawtin wrote:
> Claudio Corsi wrote:
>
>>
>> I have been using this tool to create a byte-code enhancement of
>> created class files and I kept getting a NoSuchMethodError.
>>
>> The reason that I get this is because I am running my application with
>> jdk 1.3 and the method that causes this exception is the
>> StringBuffer.append(StringBuffer) method.
>>
>> This method does not exist within jdk 1.3 but it is part of the
>> distribution of jdk 1.4.
>>
>> The interesting thing about this is that I was able to build the bcel
>> 5.1 source using jdk 1.3!
>
>
> For any program with code like:
>
> String s;
> StringBuffer b;
> ...
> b.append(s);
>
> Then using the 1.4 libraries it will compile to using
> StringBuffer.append(String), while 1.3 will use
> StringBuffer.append(Object) (neither of which have very nice threading
> properties, but that's rarely significant). The standard solution is to
> use the 1.3 libraries as the bootclasspath to javac. An easy way to do
> that is to use JDK 1.3, but I'd suggest using 1.4 with -bootclasspath.
> If that's out of your control you can always explicitly choose the other
> append method:
>
> b.append((Object)s);
>
> Tom Hawtin
>
Tom,
The code in question is LineNumberTable toString method here is the code:
public final String toString() {
StringBuffer buf = new StringBuffer();
StringBuffer line = new StringBuffer();
for(int i=0; i < line_number_table_length; i++) {
line.append(line_number_table[i].toString());
if(i < line_number_table_length - 1)
line.append(", ");
if(line.length() > 72) {
line.append('\n');
buf.append(line); <-------
line.setLength(0);
}
}
buf.append(line);
return buf.toString();
}
The shows use that we are appending a StringBuffer and StringBuffer does
not contain such a method within jdk 1.3. It has been introduced in jdk 1.4.
This will compile with jdk 1.4 and jdk 1.3. I have not javap the code
but I would assume that the jdk 1.3 compiler would call the passed
StringBuffer toString method to allow this to work.
--Claudio
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>