Copyright 2010 the original author or authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
/** * Copyright 2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */
package org.I0Itec.zkclient.serialize; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; import java.lang.reflect.Proxy;
An ObjectInputStream that is aware of the TCCL.
/** * An ObjectInputStream that is aware of the TCCL. */
public class TcclAwareObjectIputStream extends ObjectInputStream { public TcclAwareObjectIputStream(InputStream in) throws IOException { super(in); }
Load the local class equivalent of the specified stream class description. Uses the current class ClassLoader and falls back to the Thread context ClassLoader.
/** * Load the local class equivalent of the specified stream class * description. * Uses the current class {@link ClassLoader} and falls back to the {@link Thread} context {@link ClassLoader}. */
protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { try { return getClass().getClassLoader().loadClass(classDesc.getName()); } catch (ClassNotFoundException ex) { ClassLoader tccl = Thread.currentThread().getContextClassLoader(); if (tccl != null) { return tccl.loadClass(classDesc.getName()); } else { throw ex; } } }
Returns a proxy class that implements the interfaces named in a proxy class descriptor; subclasses may implement this method to read custom data from the stream along with the descriptors for dynamic proxy classes, allowing them to use an alternate loading mechanism for the interfaces and the proxy class. For each interface uses the current class ClassLoader and falls back to the Thread context ClassLoader.
/** * Returns a proxy class that implements the interfaces named in a proxy * class descriptor; subclasses may implement this method to read custom * data from the stream along with the descriptors for dynamic proxy * classes, allowing them to use an alternate loading mechanism for the * interfaces and the proxy class. * * For each interface uses the current class {@link ClassLoader} and falls back to the {@link Thread} context {@link ClassLoader}. */
protected Class resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException { ClassLoader cl = getClass().getClassLoader(); Class[] cinterfaces = new Class[interfaces.length]; for (int i = 0; i < interfaces.length; i++) { try { cinterfaces[i] = cl.loadClass(interfaces[i]); } catch (ClassNotFoundException ex) { ClassLoader tccl = Thread.currentThread().getContextClassLoader(); if (tccl != null) { return tccl.loadClass(interfaces[i]); } else { throw ex; } } } try { return Proxy.getProxyClass(cinterfaces[0].getClassLoader(), cinterfaces); } catch (IllegalArgumentException e) { throw new ClassNotFoundException(null, e); } } }