JDK-4879871 : REGRESSION: javap no longer finds classes in rt.jar without a -classpath option
  • Type: Bug
  • Component: tools
  • Sub-Component: javap
  • Affected Version: 1.4.2
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2003-06-17
  • Updated: 2003-06-18
  • Resolved: 2003-06-18
Related Reports
Duplicate :  
Relates :  
Relates :  
Description

Name: rmT116609			Date: 06/17/2003


FULL PRODUCT VERSION :
java version "1.4.2-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-beta-b19)
Java HotSpot(TM) Client VM (build 1.4.2-beta-b19, mixed mode)

FULL OS VERSION :
Microsoft Windows XP [Version 5.1.2600]

EXTRA RELEVANT SYSTEM CONFIGURATION :
* environment with or without JAVA_HOME=c:\java.
* I have the JDK installed in c:\java.
* My PATH picks up javap from c:\java\bin.

A DESCRIPTION OF THE PROBLEM :
Two problems

1. The plain command

  javap java.lang.Object

(no explicit -classpath option) no longer works in 1.4.2-beta. It used to work in all versions upto and including 1.4.1_02.

I have to specify a classpath of $JAVA_HOME/jre/lib/rt.jar for it to work.

2. Even if I do specify this classpath explicitly, it no longer prints out the flag bits or the inner classes.

For instance,

  javap java.util.Map

used to print out flags like "ACC_SUPER not set", and also the contents of the nested interface Map.Entry. In 1.4.2-beta, it no longer prints these out.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Run 'javap java.util.Map' from the command line

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Javap output:

Compiled from Map.java
public interface java.util.Map
    /* ACC_SUPER bit NOT set */
{
    public abstract int size();
    public abstract boolean isEmpty();
    public abstract boolean containsKey(java.lang.Object);
    public abstract boolean containsValue(java.lang.Object);
    public abstract java.lang.Object get(java.lang.Object);
    public abstract java.lang.Object put(java.lang.Object, java.lang.Object);
    public abstract java.lang.Object remove(java.lang.Object);
    public abstract void putAll(java.util.Map);
    public abstract void clear();
    public abstract java.util.Set keySet();
    public abstract java.util.Collection values();
    public abstract java.util.Set entrySet();
    public abstract boolean equals(java.lang.Object);
    public abstract int hashCode();
    public static interface java.util.Map. Entry
    /* ACC_SUPER bit NOT set */
{
        public abstract java.lang.Object getKey();
        public abstract java.lang.Object getValue();
        public abstract java.lang.Object setValue(java.lang.Object);
        public abstract boolean equals(java.lang.Object);
        public abstract int hashCode();
    }
}
ACTUAL -
1. Without the -classpath option:

   ERROR:could not find java.util.Map.

2. With the -classpath option:

Compiled from "Map.java"
interface java.util.Map{
    public abstract int hashCode();
    public abstract int size();
    public abstract void clear();
    public abstract boolean isEmpty();
    public abstract boolean containsKey(java.lang.Object);
    public abstract boolean containsValue(java.lang.Object);
    public abstract boolean equals(java.lang.Object);
    public abstract java.util.Collection values();
    public abstract void putAll(java.util.Map);
    public abstract java.util.Set entrySet();
    public abstract java.util.Set keySet();
    public abstract java.lang.Object get(java.lang.Object);
    public abstract java.lang.Object remove(java.lang.Object);
    public abstract java.lang.Object put(java.lang.Object,java.lang.Object);
}

Notice:
(a) inner class not printed.
(b) flags not printed
(c) formatting slightly screwed up ({ on the same line as the classname, and
no spacing before the {).

ERROR MESSAGES/STACK TRACES THAT OCCUR :
ERROR:could not find java.util.Map.

REPRODUCIBILITY :
This bug can be reproduced always.

CUSTOMER SUBMITTED WORKAROUND :
Specify -classpath $JAVA_HOME/jre/lib/rt.jar to at least get the top-level class.

No workaround for displaying the nested class.

Release Regression From : 1.4.1_03
The above release value was the last known release where this 
bug was known to work. Since then there has been a regression.

(Review ID: 188240) 
======================================================================

Comments
WORK AROUND Use "javap -Xold "
11-06-2004

EVALUATION Will investigate. ###@###.### 2003-06-17 Class finding problem is a duplicate of 4798312, which is fixed in later 1.4.2 builds and fill be fixed in the fcs version. The whitespace issue has been filed as 4880663. Not printing the inner interface has been filed as 4880672. Complaining that the ACC_SUPER bit is not set on an interface is superfluous since the bit does not affect how interface methods are resolved (they use the invokeinterface instruction instead of invokespecial and ACC_SUPER only impacts invokespecial); the bit should be set on non-interface classes however. ###@###.### 2003-06-18
18-06-2003