Skip to content

Commit 4f2168a

Browse files
committed
class-version.sh: avoid using javap
Just for you, Dscho! Unfortunately, and surprisingly, performance is not much better: export jar1=org/python/jython-standalone/2.7-b3/jython-standalone-2.7-b3.jar export jar2=org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar == Using javap == $ time class-version.sh $jar1 $jar2 org/python/jython-standalone/2.7-b3/jython-standalone-2.7-b3.jar: J2SE 7 (51.0) org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar: J2SE 5.0 (49.0) real 0m2.538s user 0m4.616s sys 0m0.810s $ time class-version.sh $jar1 $jar2 org/python/jython-standalone/2.7-b3/jython-standalone-2.7-b3.jar: J2SE 7 (51.0) org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar: J2SE 5.0 (49.0) real 0m2.382s user 0m4.467s sys 0m0.786s == Using unzip == $ time class-version.sh $jar1 $jar2 org/python/jython-standalone/2.7-b3/jython-standalone-2.7-b3.jar: J2SE 7 (51.0) org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar: J2SE 5.0 (49.0) real 0m3.026s user 0m4.443s sys 0m1.158s $ time class-version.sh $jar1 $jar2 org/python/jython-standalone/2.7-b3/jython-standalone-2.7-b3.jar: J2SE 7 (51.0) org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar: J2SE 5.0 (49.0) real 0m3.061s user 0m4.486s sys 0m1.161s == Simplifying further == Even if you cut out the sed and expr commands like so: # extract byte #7 major="$(unzip -p "$jar" "$(jar tf "$jar" | grep \.class$ | head -n 1)" | head -c 8 | hexdump -s 7 -e '1/1 "%d\n"')" The results are no more impressive: $ time class-version.sh $jar1 $jar2 org/python/jython-standalone/2.7-b3/jython-standalone-2.7-b3.jar: J2SE 7 (51) org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar: J2SE 5.0 (49) real 0m3.053s user 0m4.526s sys 0m1.151s $ time class-version.sh $jar1 $jar2 org/python/jython-standalone/2.7-b3/jython-standalone-2.7-b3.jar: J2SE 7 (51) org/python/jython-standalone/2.5.3/jython-standalone-2.5.3.jar: J2SE 5.0 (49) real 0m3.063s user 0m4.656s sys 0m1.151s
1 parent e3a6f97 commit 4f2168a

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

class-version.sh

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,19 @@ for jar in "$@"
66
do
77
# find the first class of the JAR
88
class="$(jar tf "$jar" | grep '\.class' | head -n 1 | sed 's/\//./g' | sed 's/\.class$//')"
9-
info="$(javap -verbose -classpath "$jar" "$class")"
109

11-
# extract major.minor version
12-
minor="$(echo "$info" | grep 'minor version: ' | sed 's/.*minor version: //')"
13-
major="$(echo "$info" | grep 'major version: ' | sed 's/.*major version: //')"
10+
# extract bytes 4-7
11+
info="$(unzip -p "$jar" "$(jar tf "$jar" | grep \.class$ | head -n 1)" | head -c 8 | hexdump -s 4 -e '4/1 "%d\n" "\n"')"
12+
minor1="$(echo "$info" | sed -n 1p)"
13+
minor2="$(echo "$info" | sed -n 2p)"
14+
major1="$(echo "$info" | sed -n 3p)"
15+
major2="$(echo "$info" | sed -n 4p)"
16+
17+
# compute major.minor version
18+
minor="$(expr 256 \* $minor1 + $minor2)"
19+
major="$(expr 256 \* $major1 + $major2)"
20+
21+
# derive Java version
1422
case $major in
1523
45)
1624
version="JDK 1.1"

0 commit comments

Comments
 (0)