/******************************************************************************* * 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: * Matt MacIvor - 2.4 - initial implementation ******************************************************************************/ package org.eclipse.persistence.internal.jaxb; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.eclipse.persistence.exceptions.JAXBException; import org.eclipse.persistence.internal.security.PrivilegedAccessHelper; /** * <p><b>Purpose:</b> This class provides a wrapper for an instance of AccessorFactory. * The instance can be from either the internal or public package. This class will * reflectively invoke the createFieldAccessor and createPropertyAccessor methods * on the underlying AccessorFactory to create Accessor instances. * <p> * @author mmacivor * @since EclipseLink 2.4 * */ public class AccessorFactoryWrapper { private static final String ACCESSOR_FACTORY_CREATE_FIELD_ACCESSOR = "createFieldAccessor"; private static final String ACCESSOR_FACTORY_CREATE_PROPERTY_ACCESSOR = "createPropertyAccessor"; private Object accessorFactory; private Method createFieldAccessorMethod; private Method createPropertyAccessorMethod; public AccessorFactoryWrapper(Object factory) { this.accessorFactory = factory; Class accessorClass = factory.getClass(); try { createPropertyAccessorMethod = PrivilegedAccessHelper.getDeclaredMethod(accessorClass, ACCESSOR_FACTORY_CREATE_PROPERTY_ACCESSOR, new Class[]{Class.class, Method.class, Method.class}); createFieldAccessorMethod = PrivilegedAccessHelper.getDeclaredMethod(accessorClass, ACCESSOR_FACTORY_CREATE_FIELD_ACCESSOR, new Class[]{Class.class, Field.class, boolean.class}); } catch(Exception ex) { throw JAXBException.invalidAccessorFactory(accessorClass, ex); } } public Object createFieldAccessor(Class beanClass, Field field, boolean isReadOnly) { try { return PrivilegedAccessHelper.invokeMethod(createFieldAccessorMethod, accessorFactory, new Object[]{beanClass, field, isReadOnly}); } catch(Exception ex) { throw JAXBException.errorCreatingFieldAccessor(accessorFactory, ex); } } public Object createPropertyAccessor(Class beanClass, Method getMethod, Method setMethod) { try { return PrivilegedAccessHelper.invokeMethod(createPropertyAccessorMethod, accessorFactory, new Object[]{beanClass, getMethod, setMethod}); } catch(Exception ex) { throw JAXBException.errorCreatingPropertyAccessor(accessorFactory, ex); } } }