/*
* Copyright (C) 2011 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jboss.errai.codegen.meta;
import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.List;
/**
* @author Mike Brock <cbrock@redhat.com>
*/
public abstract class MetaClass extends AbstractHasAnnotations implements MetaType, MetaGenericDeclaration {
@Override
public abstract String getName();
public abstract String getFullyQualifiedName();
public abstract String getFullyQualifiedNameWithTypeParms();
public abstract String getCanonicalName();
public abstract String getInternalName();
public abstract String getPackageName();
/**
* Returns all declared and inherited public, protected, and package-private methods
* available on this class.
*/
public abstract MetaMethod[] getMethods();
/**
* Returns all declared and inherited methods on this class that have the
* given annotation targeting them.
* <p>
*
* @param annotation
* The annotation to scan this class's methods for. Must not be null.
* @return An unmodifiable list of all declared and inherited methods of this
* class that are annotated with the given annotation.
* @throws NullPointerException
* if {@code annotation} is null.
*/
public abstract List<MetaMethod> getMethodsAnnotatedWith(Class<? extends Annotation> annotation);
public abstract List<MetaMethod> getDeclaredMethodsAnnotatedWith(Class<? extends Annotation> annotation);
public abstract List<MetaMethod> getMethodsWithMetaAnnotations(Class<? extends Annotation> annotation);
public abstract MetaMethod[] getDeclaredMethods();
public abstract MetaMethod getMethod(String name, Class... parameters);
public abstract MetaMethod getMethod(String name, MetaClass... parameters);
public abstract MetaMethod getBestMatchingMethod(String name, Class... parameters);
public abstract MetaMethod getBestMatchingMethod(String name, MetaClass... parameters);
public abstract MetaMethod getBestMatchingStaticMethod(String name, Class... parameters);
public abstract MetaMethod getBestMatchingStaticMethod(String name, MetaClass... parameters);
public abstract MetaMethod getDeclaredMethod(String name, Class... parameters);
public abstract MetaMethod getDeclaredMethod(String name, MetaClass... parameters);
public abstract MetaField[] getFields();
/**
* Returns all declared and inherited fields on this class that have the
* given annotation targeting them.
*
* @param annotation
* The annotation to scan this class's fields for. Must not be null.
* @return An unmodifiable list of all declared and inherited fields of this
* class that are annotated with the given annotation.
* @throws NullPointerException
* if {@code annotation} is null.
*/
public abstract List<MetaField> getFieldsAnnotatedWith(Class<? extends Annotation> annotation);
public abstract List<MetaField> getFieldsWithMetaAnnotations(Class<? extends Annotation> annotations);
public abstract List<MetaParameter> getParametersAnnotatedWith(Class<? extends Annotation> annotation);
public abstract MetaField[] getDeclaredFields();
public abstract MetaField getField(String name);
public abstract MetaField getDeclaredField(String name);
public abstract MetaConstructor[] getConstructors();
public abstract MetaConstructor[] getDeclaredConstructors();
public abstract MetaClass[] getDeclaredClasses();
public abstract MetaConstructor getConstructor(Class... parameters);
public abstract MetaConstructor getConstructor(MetaClass... parameters);
public abstract MetaConstructor getBestMatchingConstructor(Class... parameters);
public abstract MetaConstructor getBestMatchingConstructor(MetaClass... parameters);
public abstract MetaConstructor getDeclaredConstructor(Class... parameters);
public abstract MetaConstructor getDeclaredConstructor(MetaClass... parameters);
public abstract MetaParameterizedType getParameterizedType();
public abstract MetaParameterizedType getGenericSuperClass();
public abstract MetaClass[] getInterfaces();
public abstract MetaClass getSuperClass();
public abstract Collection<MetaClass> getAllSuperTypesAndInterfaces();
public abstract MetaClass getComponentType();
public abstract MetaClass getOuterComponentType();
/**
* Reports if the type represented by this MetaClass is a supertype of (or the
* same class as) the type represented by the given MetaClass. In other words,
* this method returns true if the following code would compile without error,
* where ThisType is the class represented by this MetaClass object, and
* GivenType is the class represented by the given "clazz" argument:
*
* <pre>
* GivenType given = ...;
* ThisType a = given;
* </pre>
*
* @param clazz
* The type to check for assignability to this MetaClass's type.
* @return True if the given type is assignable to this metaclass's type.
*/
public abstract boolean isAssignableFrom(MetaClass clazz);
public abstract boolean isAssignableTo(MetaClass clazz);
/**
* Reports if the type represented by this MetaClass is a supertype of (or the
* same class as) the given class. In other words, this method returns true if
* the following code would compile without error, where ThisType is the class
* represented by this MetaClass object, and GivenType is the class
* represented by the given "clazz" argument:
*
* <pre>
* GivenType given = ...;
* ThisType a = given;
* </pre>
*
* @param clazz The type to check for assignability to this MetaClass's type.
* @return True if the given type is assignable to this metaclass's type.
*/
public abstract boolean isAssignableFrom(Class clazz);
public abstract boolean isAssignableTo(Class clazz);
public abstract boolean isDefaultInstantiableSubtypeOf(String fqcn);
public abstract boolean isPrimitive();
public abstract boolean isInterface();
public abstract boolean isAbstract();
public abstract boolean isArray();
public abstract boolean isEnum();
public abstract boolean isAnnotation();
public abstract boolean isPublic();
public abstract boolean isPrivate();
public abstract boolean isProtected();
public abstract boolean isFinal();
public abstract boolean isStatic();
public abstract boolean isVoid();
public abstract boolean isDefaultInstantiable();
public abstract boolean isSynthetic();
public abstract boolean isAnonymousClass();
public boolean isConcrete() {
return !isInterface()
&& !isAbstract()
&& !isSynthetic()
&& !isAnonymousClass()
&& !isPrimitive()
&& !isArray()
&& !isAnnotation()
&& !isEnum();
}
public abstract MetaClass asBoxed();
public abstract MetaClass asUnboxed();
public abstract MetaClass asArrayOf(int dimensions);
/**
* Returns a MetaClass that represents the same class as this one, but
* guaranteed to have no type parameters.
*
* @return A raw MetaClass representing the same class as this MetaClass. If
* this class has no type parameters in the first place, the receiving
* MetaClass instance is returned.
*/
public abstract MetaClass getErased();
public abstract boolean isPrimitiveWrapper();
public abstract Class<?> asClass();
/**
* Searches for the named field in this type, its superinterfaces, and its superclasses.
* <p>
* The search proceeds as in {@link #getField(String)}, but includes all public, protected, default accessibility, and
* private fields. Whether a field is static or not does not affect this search.
*
* @param name The name of the field to search for. Not null.
* @return The first field with the given name that was encountered by the search.
*/
public abstract MetaField getInheritedField(String name);
public abstract BeanDescriptor getBeanDescriptor();
public abstract int hashContent();
}