Search in sources :

Example 6 with ReflectionFactory

use of jdk.internal.reflect.ReflectionFactory in project Bytecoder by mirkosertic.

the class Class method getEnclosingMethod.

/**
 * If this {@code Class} object represents a local or anonymous
 * class within a method, returns a {@link
 * java.lang.reflect.Method Method} object representing the
 * immediately enclosing method of the underlying class. Returns
 * {@code null} otherwise.
 *
 * In particular, this method returns {@code null} if the underlying
 * class is a local or anonymous class immediately enclosed by a type
 * declaration, instance initializer or static initializer.
 *
 * @return the immediately enclosing method of the underlying class, if
 *     that class is a local or anonymous class; otherwise {@code null}.
 *
 * @throws SecurityException
 *         If a security manager, <i>s</i>, is present and any of the
 *         following conditions is met:
 *
 *         <ul>
 *
 *         <li> the caller's class loader is not the same as the
 *         class loader of the enclosing class and invocation of
 *         {@link SecurityManager#checkPermission
 *         s.checkPermission} method with
 *         {@code RuntimePermission("accessDeclaredMembers")}
 *         denies access to the methods within the enclosing class
 *
 *         <li> the caller's class loader is not the same as or an
 *         ancestor of the class loader for the enclosing class and
 *         invocation of {@link SecurityManager#checkPackageAccess
 *         s.checkPackageAccess()} denies access to the package
 *         of the enclosing class
 *
 *         </ul>
 * @since 1.5
 */
@CallerSensitive
public Method getEnclosingMethod() throws SecurityException {
    EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();
    if (enclosingInfo == null)
        return null;
    else {
        if (!enclosingInfo.isMethod())
            return null;
        MethodRepository typeInfo = MethodRepository.make(enclosingInfo.getDescriptor(), getFactory());
        Class<?> returnType = toClass(typeInfo.getReturnType());
        Type[] parameterTypes = typeInfo.getParameterTypes();
        Class<?>[] parameterClasses = new Class<?>[parameterTypes.length];
        // don't have generics information
        for (int i = 0; i < parameterClasses.length; i++) parameterClasses[i] = toClass(parameterTypes[i]);
        // Perform access check
        final Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            enclosingCandidate.checkMemberAccess(sm, Member.DECLARED, Reflection.getCallerClass(), true);
        }
        Method[] candidates = enclosingCandidate.privateGetDeclaredMethods(false);
        /*
             * Loop over all declared methods; match method name,
             * number of and type of parameters, *and* return
             * type.  Matching return type is also necessary
             * because of covariant returns, etc.
             */
        ReflectionFactory fact = getReflectionFactory();
        for (Method m : candidates) {
            if (m.getName().equals(enclosingInfo.getName()) && arrayContentsEq(parameterClasses, fact.getExecutableSharedParameterTypes(m))) {
                // finally, check return type
                if (m.getReturnType().equals(returnType)) {
                    return fact.copyMethod(m);
                }
            }
        }
        throw new InternalError("Enclosing method not found");
    }
}
Also used : Method(java.lang.reflect.Method) GenericArrayType(java.lang.reflect.GenericArrayType) AnnotatedType(java.lang.reflect.AnnotatedType) Type(java.lang.reflect.Type) MethodRepository(sun.reflect.generics.repository.MethodRepository) CoreReflectionFactory(sun.reflect.generics.factory.CoreReflectionFactory) ReflectionFactory(jdk.internal.reflect.ReflectionFactory) CallerSensitive(jdk.internal.reflect.CallerSensitive)

Example 7 with ReflectionFactory

use of jdk.internal.reflect.ReflectionFactory in project Bytecoder by mirkosertic.

the class Class method copyMethods.

private static Method[] copyMethods(Method[] arg) {
    Method[] out = new Method[arg.length];
    ReflectionFactory fact = getReflectionFactory();
    for (int i = 0; i < arg.length; i++) {
        out[i] = fact.copyMethod(arg[i]);
    }
    return out;
}
Also used : CoreReflectionFactory(sun.reflect.generics.factory.CoreReflectionFactory) ReflectionFactory(jdk.internal.reflect.ReflectionFactory) Method(java.lang.reflect.Method)

Example 8 with ReflectionFactory

use of jdk.internal.reflect.ReflectionFactory in project Bytecoder by mirkosertic.

the class Class method copyFields.

private static Field[] copyFields(Field[] arg) {
    Field[] out = new Field[arg.length];
    ReflectionFactory fact = getReflectionFactory();
    for (int i = 0; i < arg.length; i++) {
        out[i] = fact.copyField(arg[i]);
    }
    return out;
}
Also used : ObjectStreamField(java.io.ObjectStreamField) Field(java.lang.reflect.Field) CoreReflectionFactory(sun.reflect.generics.factory.CoreReflectionFactory) ReflectionFactory(jdk.internal.reflect.ReflectionFactory)

Aggregations

ReflectionFactory (jdk.internal.reflect.ReflectionFactory)8 CoreReflectionFactory (sun.reflect.generics.factory.CoreReflectionFactory)8 Method (java.lang.reflect.Method)4 Constructor (java.lang.reflect.Constructor)3 AnnotatedType (java.lang.reflect.AnnotatedType)2 GenericArrayType (java.lang.reflect.GenericArrayType)2 Type (java.lang.reflect.Type)2 CallerSensitive (jdk.internal.reflect.CallerSensitive)2 ObjectStreamField (java.io.ObjectStreamField)1 Field (java.lang.reflect.Field)1 ArrayList (java.util.ArrayList)1 ConstructorRepository (sun.reflect.generics.repository.ConstructorRepository)1 MethodRepository (sun.reflect.generics.repository.MethodRepository)1