View Javadoc

1   /***************************************************************************************
2    * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved.                 *
3    * http://aspectwerkz.codehaus.org                                                    *
4    * ---------------------------------------------------------------------------------- *
5    * The software in this package is published under the terms of the LGPL license      *
6    * a copy of which has been included with this distribution in the license.txt file.  *
7    **************************************************************************************/
8   package org.codehaus.aspectwerkz.util;
9   
10  import java.io.IOException;
11  import java.io.InputStream;
12  import java.io.ObjectInputStream;
13  import java.io.ObjectStreamClass;
14  import java.lang.reflect.Proxy;
15  
16  /***
17   * Fixes the ObjectInputStream class, which does not always resolve the class correctly in complex
18   * class loader hierarchies.
19   *
20   * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr</a>
21   */
22  public class UnbrokenObjectInputStream extends ObjectInputStream {
23  
24      /***
25       * Creates a a new instance.
26       *
27       * @throws IOException
28       * @throws SecurityException
29       */
30      public UnbrokenObjectInputStream() throws IOException, SecurityException {
31          super();
32      }
33  
34      /***
35       * Creates a new instance.
36       *
37       * @param in the input stream to deserialize the object from.
38       * @throws IOException
39       */
40      public UnbrokenObjectInputStream(final InputStream in) throws IOException {
41          super(in);
42      }
43  
44      /***
45       * Overrides the parents resolveClass method and resolves the class using the context class loader
46       * instead of Class.forName().
47       */
48      protected Class resolveClass(final ObjectStreamClass desc) throws IOException, ClassNotFoundException {
49          try {
50              Class resolved = Class.forName(desc.getName(), false, Thread.currentThread().getContextClassLoader());
51              return resolved;
52          } catch (ClassNotFoundException ex) {
53              return super.resolveClass(desc);
54          }
55      }
56  
57      /***
58       * Overrides the parents resolveClass method and resolves the class using the context class loader
59       * instead of Class.forName().
60       */
61      protected Class resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException {
62          try {
63              Class[] classObjs = new Class[interfaces.length];
64              for (int i = 0; i < interfaces.length; i++) {
65                  classObjs[i] = Class.forName(interfaces[i], false, Thread.currentThread().getContextClassLoader());
66              }
67              return Proxy.getProxyClass(Thread.currentThread().getContextClassLoader(), classObjs);
68          } catch (Exception e) {
69              e.printStackTrace();
70              return super.resolveProxyClass(interfaces);
71          }
72      }
73  
74  }