/******************************************************************************* * Copyright (c) 2012, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation * 08/01/2012-2.5 Chris Delahunt * - 371950: Metadata caching ******************************************************************************/ package org.eclipse.persistence.internal.jpa.metadata.listeners; import java.io.Serializable; import java.lang.reflect.Method; import java.security.AccessController; import java.security.PrivilegedActionException; import org.eclipse.persistence.exceptions.ValidationException; import org.eclipse.persistence.internal.security.PrivilegedAccessHelper; import org.eclipse.persistence.internal.security.PrivilegedClassForName; /** * INTERNAL: * Class used to represent java.lang.reflect.Method instances to allow serialization * * @author Chris Delahunt * @since EclipseLink 2.5 */ public class MethodSerialImpl implements Serializable { public String methodName; public String declaringClassName; public java.util.List<String> paramList; public MethodSerialImpl(Method method) { methodName = method.getName(); declaringClassName = method.getDeclaringClass().getName(); paramList = new java.util.ArrayList((method.getParameterTypes()).length); for (Class clazz: method.getParameterTypes()) { paramList.add(clazz.getName()); } } public Method convertToMethod(ClassLoader loader) throws NoSuchMethodException { //Build the class Class declaringClass = null; try { if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){ try { declaringClass = AccessController.doPrivileged(new PrivilegedClassForName(declaringClassName, true, loader)); } catch (PrivilegedActionException exception) { throw ValidationException.unableToLoadClass(declaringClassName, exception.getException()); } } else { declaringClass = PrivilegedAccessHelper.getClassForName(declaringClassName, true, loader); } } catch (ClassNotFoundException exception) { throw ValidationException.unableToLoadClass(declaringClassName, exception); } //Build the method argument class types. Class[] argTypes = new Class[paramList.size()]; int i=0; for (String paramType: paramList) { try { if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){ try { argTypes[i++] = AccessController.doPrivileged(new PrivilegedClassForName(paramType, true, loader)); } catch (PrivilegedActionException exception) { throw ValidationException.unableToLoadClass(paramType, exception.getException()); } } else { argTypes[i++] = PrivilegedAccessHelper.getClassForName(paramType, true, loader); } } catch (ClassNotFoundException exception) { throw ValidationException.unableToLoadClass(paramType, exception); } } return org.eclipse.persistence.internal.helper.Helper.getDeclaredMethod(declaringClass, methodName, argTypes); } }