/** Invoke a method on an object using reflection. */
 public static Object invoke(final Object target, final Method method, final Object... args) {
   try {
     return AccessController.doPrivileged(
         new PrivilegedExceptionAction<Object>() {
           public Object run() throws IllegalAccessException, InvocationTargetException {
             if (!method.isAccessible())
               method.setAccessible(
                   true); // Say please - else invoke() will fail if method is protected
             return method.invoke(target, args);
           }
         });
   } catch (PrivilegedActionException e) {
     e.printStackTrace();
   }
   return null;
 }
  /*
   * Does the real work of creating an AppletAudioClip from an InputStream.
   * This function is used by both constructors.
   */
  void createAppletAudioClip(InputStream in) throws IOException {

    // If we haven't initialized yet, we need to find the AudioClip constructor using reflection.
    // We'll use com.sun.media.sound.JavaSoundAudioClip to implement AudioClip if the Java Sound
    // extension is installed.  Otherwise, we use sun.audio.SunAudioClip.

    if (acConstructor == null) {

      if (DEBUG) System.out.println("Initializing AudioClip constructor.");

      try {

        acConstructor =
            (Constructor)
                AccessController.doPrivileged(
                    new PrivilegedExceptionAction() {

                      public Object run()
                          throws NoSuchMethodException, SecurityException, ClassNotFoundException {

                        Class acClass = null;

                        try {

                          // attempt to load the Java Sound extension class JavaSoundAudioClip

                          acClass =
                              Class.forName(
                                  "com.sun.media.sound.JavaSoundAudioClip",
                                  true,
                                  ClassLoader
                                      .getSystemClassLoader()); // may throw ClassNotFoundException

                          if (DEBUG) System.out.println("Loaded JavaSoundAudioClip");

                        } catch (ClassNotFoundException e) {

                          acClass =
                              Class.forName(
                                  "sun.audio.SunAudioClip",
                                  true,
                                  null); // may throw ClassNotFoundException

                          if (DEBUG) System.out.println("Loaded SunAudioClip");
                        }

                        Class[] parms = new Class[1];
                        parms[0] =
                            Class.forName(
                                "java.io.InputStream"); // may throw ClassNotFoundException
                        return acClass.getConstructor(
                            parms); // may throw NoSuchMethodException or SecurityException
                      }
                    });

      } catch (PrivilegedActionException e) {

        if (DEBUG) System.out.println("Got a PrivilegedActionException: " + e.getException());

        // e.getException() may be a NoSuchMethodException, SecurityException, or
        // ClassNotFoundException.
        // however, we throw an IOException to avoid changing the interfaces....

        throw new IOException("Failed to get AudioClip constructor: " + e.getException());
      }
    } // if not initialized

    // Now instantiate the AudioClip object using the constructor we discovered above.

    try {

      Object[] args = new Object[] {in};
      audioClip = (AudioClip) acConstructor.newInstance(args); // may throw InstantiationException,
      // IllegalAccessException,
      // IllegalArgumentException,
      // InvocationTargetException

    } catch (Exception e3) {

      // no matter what happened, we throw an IOException to avoid changing the interfaces....
      throw new IOException("Failed to construct the AudioClip: " + e3);
    }
  }