Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4187785

ClassLoader.defineClass throws NoClassDefFoundError on incorrect class name

    Details

    • Subcomponent:
    • CPU:
      sparc
    • OS:
      solaris_2.5

      Description



      Name: mgC56079 Date: 11/06/98


      ClassLoader.defineClass(String name, byte[] b, int off, int len)
      throws NoClassDefFoundError if name does not match the name derived from
      the class data array.
      According to javadoc, the call should result in a ClassFormatError:

          /**
           * Converts an array of bytes into an instance of class <code>Class</code>.
           * Before the Class can be used it must be resolved.
           * <p>
           * This method assigns a default <code>ProtectionDomain</code> to
           * the newly defined class. The <code>ProtectionDomain</code>
           * contains the set of permissions granted when
           * a call to <code>Policy.getPolicy().getPermissions()</code> is made with
           * a Codesource of <code>null,null</code>. The default domain is
           * created on the first invocation of <code>defineClass</code>, and
           * re-used on subsequent calls.
           * <p>
           * To assign a specific <code>ProtectionDomain</code> to the class,
           * use the <code>defineClass</code> method that takes a
           * <code>ProtectionDomain</code> as one of its arguments.
           *
           * @param name the expected name of the class, or <code>null</code>
           * if not known, using '.' and not '/' as the separator
           * and without a trailing ".class" suffix.
           * @param b the bytes that make up the class data. The bytes in
           * positions <code>off</code> through <code>off+len-1</code>
           * should have the format of a valid class file as defined
           * by the
           * <a href="http://java.sun.com/docs/books/vmspec/">Java
           * Virtual Machine Specification</a>.
           * @param off the start offset of the class data
           * @param len the length of the class data
           * @return the <code>Class</code> object that was created from the
           * specified class data
           * @exception ClassFormatError if the data did not contain a valid class
           * @exception IndexOutOfBoundsException if either <code>off</code> or
           * <code>len</code> is negative, or if
           * <code>off+len</code> is greater than <code>b.length</code>.
           * @see ClassLoader#loadClass(java.lang.String, boolean)
           * @see ClassLoader#resolveClass(java.lang.Class)
           * @see java.security.ProtectionDomain
           * @see java.security.Policy
           * @see java.security.CodeSource
           * @see java.security.SecureClassLoader
           * @since JDK1.1
           */
          protected final Class defineClass(String name, byte[] b, int off, int len)
      throws ClassFormatError

      ==== here is the test demonstrating the bug (CLoader.java) ====
      import java.io.FileInputStream;
      public class CLoader {

          public static void main(String[] s) {
            MyClassLoader loader = new MyClassLoader();
            byte[] source=new byte[10000];
            int len;
            try {
                FileInputStream f=new FileInputStream("CLoader.class");
                len=f.read(source,0,source.length);
            }
            catch (Exception e) {
                e.printStackTrace();
                return;
            }
            try {
              loader.myDefineClass("incorrect.class.name",source,0,len);
              System.out.println("failed: unexpected success");
            }
            catch (ClassFormatError e) {
                System.out.println("passed");
            }
            catch (Throwable t) {
                System.out.println("failed");
                t.printStackTrace();
            }
          }

      }

      class MyClassLoader extends ClassLoader {

          public Class myDefineClass(String name, byte[] b, int off, int len) {
              return defineClass(name, b, off, len);
          }

      }
      ==== sample run (jdk1.2fcsQ) ====
      % java CLoader
      failed
      java.lang.NoClassDefFoundError: incorrect/class/name (wrong name: CLoader)
      at java.lang.ClassLoader.defineClass0(Native Method)
      at java.lang.ClassLoader.defineClass(Compiled Code)
      at MyClassLoader.myDefineClass(Compiled Code)
      at CLoader.main(Compiled Code)

      ======================================================================

        Attachments

          Activity

            People

            • Assignee:
              gbrachasunw Gilad Bracha (Inactive)
              Reporter:
              mgorshen Mikhail Gorshenev (Inactive)
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:
                Imported:
                Indexed: