/* * Copyright 2016 higherfrequencytrading.com * * 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 net.openhft.lang.io.serialization.impl; import net.openhft.lang.io.NativeBytes; import net.openhft.lang.io.serialization.ObjectFactory; import java.lang.reflect.Modifier; /** * Object factory which creates an object by means of {@code Unsafe.allocateInstance()} call, * i. e. without calling constructor. * * @param <E> type of created objects */ public final class AllocateInstanceObjectFactory<E> implements ObjectFactory<E> { private static final long serialVersionUID = 0L; private final Class<E> eClass; public AllocateInstanceObjectFactory(Class<E> eClass) { if (eClass.isInterface() || Modifier.isAbstract(eClass.getModifiers()) || eClass.isEnum()) { throw new IllegalArgumentException(eClass + " should be a non-abstract non-enum class"); } this.eClass = eClass; } public Class<E> allocatedClass() { return eClass; } @SuppressWarnings("unchecked") @Override public E create() throws InstantiationException { return (E) NativeBytes.UNSAFE.allocateInstance(eClass); } @Override public boolean equals(Object obj) { return obj != null && obj.getClass() == getClass() && ((AllocateInstanceObjectFactory) obj).eClass == eClass; } @Override public int hashCode() { return eClass.hashCode(); } @Override public String toString() { return getClass().getSimpleName() + "{eClass=" + eClass + "}"; } }