Search in sources :

Example 6 with MethodHandler

use of javassist.util.proxy.MethodHandler in project orientdb by orientechnologies.

the class OObjectEntityEnhancer method getProxiedInstance.

@SuppressWarnings("unchecked")
public <T> T getProxiedInstance(final Class<T> iClass, Object iEnclosingInstance, final ODocument doc, final ProxyObject parent, Object... iArgs) {
    if (iClass == null) {
        throw new OSerializationException("Type '" + doc.getClassName() + "' cannot be serialized because is not part of registered entities. To fix this error register this class");
    }
    final Class<T> c;
    boolean isInnerClass = OObjectEntitySerializer.getEnclosingClass(iClass) != null;
    if (Proxy.class.isAssignableFrom(iClass)) {
        c = iClass;
    } else {
        ProxyFactory f = new ProxyFactory();
        f.setSuperclass(iClass);
        if (customMethodFilters.get(iClass) != null) {
            f.setFilter(customMethodFilters.get(iClass));
        } else {
            f.setFilter(defaultMethodFilter);
        }
        c = f.createClass();
    }
    MethodHandler mi = new OObjectProxyMethodHandler(doc);
    ((OObjectProxyMethodHandler) mi).setParentObject(parent);
    try {
        T newEntity;
        if (iArgs != null && iArgs.length > 0) {
            if (isInnerClass) {
                if (iEnclosingInstance == null) {
                    iEnclosingInstance = iClass.getEnclosingClass().newInstance();
                }
                Object[] newArgs = new Object[iArgs.length + 1];
                newArgs[0] = iEnclosingInstance;
                for (int i = 0; i < iArgs.length; i++) {
                    newArgs[i + 1] = iArgs[i];
                }
                iArgs = newArgs;
            }
            Constructor<T> constructor = null;
            for (Constructor<?> constr : c.getConstructors()) {
                boolean found = true;
                if (constr.getParameterTypes().length == iArgs.length) {
                    for (int i = 0; i < constr.getParameterTypes().length; i++) {
                        Class<?> parameterType = constr.getParameterTypes()[i];
                        if (parameterType.isPrimitive()) {
                            if (!isPrimitiveParameterCorrect(parameterType, iArgs[i])) {
                                found = false;
                                break;
                            }
                        } else if (iArgs[i] != null && !parameterType.isAssignableFrom(iArgs[i].getClass())) {
                            found = false;
                            break;
                        }
                    }
                } else {
                    continue;
                }
                if (found) {
                    constructor = (Constructor<T>) constr;
                    break;
                }
            }
            if (constructor != null) {
                newEntity = (T) constructor.newInstance(iArgs);
                initDocument(iClass, newEntity, doc, (ODatabaseObject) ODatabaseRecordThreadLocal.INSTANCE.get().getDatabaseOwner());
            } else {
                if (iEnclosingInstance != null)
                    newEntity = createInstanceNoParameters(c, iEnclosingInstance);
                else
                    newEntity = createInstanceNoParameters(c, iClass);
            }
        } else {
            if (iEnclosingInstance != null)
                newEntity = createInstanceNoParameters(c, iEnclosingInstance);
            else
                newEntity = createInstanceNoParameters(c, iClass);
        }
        ((Proxy) newEntity).setHandler(mi);
        if (OObjectEntitySerializer.hasBoundedDocumentField(iClass))
            OObjectEntitySerializer.setFieldValue(OObjectEntitySerializer.getBoundedDocumentField(iClass), newEntity, doc);
        OObjectEntitySerializer.setVersionField(iClass, newEntity, doc.getVersion());
        return newEntity;
    } catch (InstantiationException ie) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), ie);
    } catch (IllegalAccessException iae) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), iae);
    } catch (IllegalArgumentException iae) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), iae);
    } catch (SecurityException se) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), se);
    } catch (InvocationTargetException ite) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), ite);
    } catch (NoSuchMethodException nsme) {
        OLogManager.instance().error(this, "Error creating proxied instance for class " + iClass.getName(), nsme);
    }
    return null;
}
Also used : OSerializationException(com.orientechnologies.orient.core.exception.OSerializationException) ProxyFactory(javassist.util.proxy.ProxyFactory) InvocationTargetException(java.lang.reflect.InvocationTargetException) MethodHandler(javassist.util.proxy.MethodHandler) Proxy(javassist.util.proxy.Proxy) ProxyObject(javassist.util.proxy.ProxyObject) ODatabaseObject(com.orientechnologies.orient.core.db.object.ODatabaseObject)

Example 7 with MethodHandler

use of javassist.util.proxy.MethodHandler in project byte-buddy by raphw.

the class ClassByExtensionBenchmark method benchmarkJavassist.

/**
     * Performs a benchmark of a class extension using javassist proxies.
     *
     * @return The created instance, in order to avoid JIT removal.
     * @throws java.lang.Exception If the invocation causes an exception.
     */
@Benchmark
public ExampleClass benchmarkJavassist() throws Exception {
    ProxyFactory proxyFactory = new ProxyFactory() {

        @Override
        protected ClassLoader getClassLoader() {
            return newClassLoader();
        }
    };
    proxyFactory.setUseCache(false);
    proxyFactory.setSuperclass(baseClass);
    proxyFactory.setFilter(new MethodFilter() {

        public boolean isHandled(Method method) {
            return method.getDeclaringClass() == baseClass;
        }
    });
    @SuppressWarnings("unchecked") Object instance = proxyFactory.createClass().getDeclaredConstructor().newInstance();
    ((javassist.util.proxy.Proxy) instance).setHandler(new MethodHandler() {

        public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
            return proceed.invoke(self, args);
        }
    });
    return (ExampleClass) instance;
}
Also used : MethodHandler(javassist.util.proxy.MethodHandler) ExampleClass(net.bytebuddy.benchmark.specimen.ExampleClass) ProxyFactory(javassist.util.proxy.ProxyFactory) MethodFilter(javassist.util.proxy.MethodFilter) Method(java.lang.reflect.Method)

Aggregations

MethodHandler (javassist.util.proxy.MethodHandler)7 Method (java.lang.reflect.Method)6 ProxyFactory (javassist.util.proxy.ProxyFactory)6 MethodFilter (javassist.util.proxy.MethodFilter)4 Proxy (javassist.util.proxy.Proxy)2 ProxyObject (javassist.util.proxy.ProxyObject)2 ODatabaseObject (com.orientechnologies.orient.core.db.object.ODatabaseObject)1 OSerializationException (com.orientechnologies.orient.core.exception.OSerializationException)1 Element (com.tinkerpop.blueprints.Element)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 Proxy (java.lang.reflect.Proxy)1 URLClassLoader (java.net.URLClassLoader)1 ExecutionException (java.util.concurrent.ExecutionException)1 ExampleClass (net.bytebuddy.benchmark.specimen.ExampleClass)1 ExampleInterface (net.bytebuddy.benchmark.specimen.ExampleInterface)1 StubMethod (net.bytebuddy.implementation.StubMethod)1