/*
* Copyright 2014 - 2020 Rafael Winterhalter
*
* 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.bytebuddy.utility;
import net.bytebuddy.build.CachedReturnPlugin;
import net.bytebuddy.description.type.TypeDefinition;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.description.type.TypeList;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import org.objectweb.asm.Opcodes;
import java.io.Serializable;
import java.lang.reflect.*;
Representations of Java types that do not exist in Java 6 but that have a special meaning to the JVM.
/**
* Representations of Java types that do not exist in Java 6 but that have a special meaning to the JVM.
*/
public enum JavaType {
The Java 12 java.lang.constant.Constable
type. /**
* The Java 12 {@code java.lang.constant.Constable} type.
*/
CONSTABLE("java.lang.constant.Constable", Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE, TypeDescription.UNDEFINED),
The Java 12 java.lang.invoke.TypeDescriptor
type. /**
* The Java 12 {@code java.lang.invoke.TypeDescriptor} type.
*/
TYPE_DESCRIPTOR("java.lang.invoke.TypeDescriptor", Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE, TypeDescription.UNDEFINED),
The Java 12 java.lang.invoke.TypeDescriptor$OfMethod
type. /**
* The Java 12 {@code java.lang.invoke.TypeDescriptor$OfMethod} type.
*/
TYPE_DESCRIPTOR_OF_FIELD("java.lang.invoke.TypeDescriptor$OfField",
Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE,
TypeDescription.UNDEFINED,
TYPE_DESCRIPTOR.getTypeStub()),
The Java 12 java.lang.invoke.TypeDescriptor$OfMethod
type. /**
* The Java 12 {@code java.lang.invoke.TypeDescriptor$OfMethod} type.
*/
TYPE_DESCRIPTOR_OF_METHOD("java.lang.invoke.TypeDescriptor$OfMethod",
Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE,
TypeDescription.UNDEFINED,
TYPE_DESCRIPTOR.getTypeStub()),
The Java 12 java.lang.constant.ConstableDesc
type. /**
* The Java 12 {@code java.lang.constant.ConstableDesc} type.
*/
CONSTANT_DESCRIPTION("java.lang.constant.ConstantDesc", Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE, TypeDescription.UNDEFINED),
The Java 12 java.lang.constant.DynamicConstantDesc
type. /**
* The Java 12 {@code java.lang.constant.DynamicConstantDesc} type.
*/
DYNAMIC_CONSTANT_DESCRIPTION("java.lang.constant.DynamicConstantDesc",
Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT,
TypeDescription.OBJECT,
CONSTANT_DESCRIPTION.getTypeStub()),
The Java 12 java.lang.constant.ClassDesc
type. /**
* The Java 12 {@code java.lang.constant.ClassDesc} type.
*/
CLASS_DESCRIPTION("java.lang.constant.ClassDesc",
Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE,
TypeDescription.UNDEFINED,
CONSTANT_DESCRIPTION.getTypeStub(),
TYPE_DESCRIPTOR_OF_FIELD.getTypeStub()),
The Java 12 java.lang.constant.MethodTypeDesc
type. /**
* The Java 12 {@code java.lang.constant.MethodTypeDesc} type.
*/
METHOD_TYPE_DESCRIPTION("java.lang.constant.MethodTypeDesc",
Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE,
TypeDescription.UNDEFINED,
CONSTANT_DESCRIPTION.getTypeStub(),
TYPE_DESCRIPTOR_OF_METHOD.getTypeStub()),
The Java 12 java.lang.constant.MethodHandleDesc
type. /**
* The Java 12 {@code java.lang.constant.MethodHandleDesc} type.
*/
METHOD_HANDLE_DESCRIPTION("java.lang.constant.MethodHandleDesc",
Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE,
TypeDescription.UNDEFINED,
CONSTANT_DESCRIPTION.getTypeStub()),
The Java 12 java.lang.constant.DirectMethodHandleDesc
type. /**
* The Java 12 {@code java.lang.constant.DirectMethodHandleDesc} type.
*/
DIRECT_METHOD_HANDLE_DESCRIPTION("java.lang.constant.DirectMethodHandleDesc",
Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE,
TypeDescription.UNDEFINED,
METHOD_HANDLE_DESCRIPTION.getTypeStub()),
The Java 7 java.lang.invoke.MethodHandle
type. /**
* The Java 7 {@code java.lang.invoke.MethodHandle} type.
*/
METHOD_HANDLE("java.lang.invoke.MethodHandle", Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, TypeDescription.OBJECT, CONSTABLE.getTypeStub()),
The Java 7 java.lang.invoke.MethodHandles
type. /**
* The Java 7 {@code java.lang.invoke.MethodHandles} type.
*/
METHOD_HANDLES("java.lang.invoke.MethodHandles", Opcodes.ACC_PUBLIC, Object.class),
The Java 7 java.lang.invoke.MethodType
type. /**
* The Java 7 {@code java.lang.invoke.MethodType} type.
*/
METHOD_TYPE("java.lang.invoke.MethodType",
Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL,
TypeDescription.OBJECT,
CONSTABLE.getTypeStub(),
TYPE_DESCRIPTOR_OF_METHOD.getTypeStub(),
TypeDescription.ForLoadedType.of(Serializable.class)),
The Java 7 java.lang.invoke.MethodTypes.Lookup
type. /**
* The Java 7 {@code java.lang.invoke.MethodTypes.Lookup} type.
*/
METHOD_HANDLES_LOOKUP("java.lang.invoke.MethodHandles$Lookup", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL, Object.class),
The Java 7 java.lang.invoke.CallSite
type. /**
* The Java 7 {@code java.lang.invoke.CallSite} type.
*/
CALL_SITE("java.lang.invoke.CallSite", Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, Object.class),
The Java 9 java.lang.invoke.VarHandle
type. /**
* The Java 9 {@code java.lang.invoke.VarHandle} type.
*/
VAR_HANDLE("java.lang.invoke.VarHandle", Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, TypeDescription.Generic.OBJECT, CONSTABLE.getTypeStub()),
The Java 8 java.lang.reflect.Parameter
type. /**
* The Java 8 {@code java.lang.reflect.Parameter} type.
*/
PARAMETER("java.lang.reflect.Parameter", Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, Object.class, AnnotatedElement.class),
The Java 7 java.lang.reflect.Executable
type. /**
* The Java 7 {@code java.lang.reflect.Executable} type.
*/
EXECUTABLE("java.lang.reflect.Executable", Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, AccessibleObject.class, Member.class, GenericDeclaration.class),
The Java 9 java.lang.Module
type. /**
* The Java 9 {@code java.lang.Module} type.
*/
MODULE("java.lang.Module", Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, Object.class, AnnotatedElement.class),
The Java 14 java.lang.Record
type. /**
* The Java 14 {@code java.lang.Record} type.
*/
RECORD("java.lang.Record", Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, Object.class),
The Java 14 java.lang.runtime.ObjectMethods
type. /**
* The Java 14 {@code java.lang.runtime.ObjectMethods} type.
*/
OBJECT_METHODS("java.lang.runtime.ObjectMethods", Opcodes.ACC_PUBLIC, Object.class);
The type description to represent this type which is either a loaded type or a stub.
/**
* The type description to represent this type which is either a loaded type or a stub.
*/
private final TypeDescription typeDescription;
Creates a new java type representation.
Params: - typeName – The binary name of this type.
- modifiers – The modifiers of this type when creating a stub.
- superClass – The super class of this type when creating a stub.
- anInterface – The interfaces of this type when creating a stub.
/**
* Creates a new java type representation.
*
* @param typeName The binary name of this type.
* @param modifiers The modifiers of this type when creating a stub.
* @param superClass The super class of this type when creating a stub.
* @param anInterface The interfaces of this type when creating a stub.
*/
JavaType(String typeName, int modifiers, Type superClass, Type... anInterface) {
this(typeName, modifiers, superClass == null
? TypeDescription.Generic.UNDEFINED
: TypeDescription.Generic.Sort.describe(superClass), new TypeList.Generic.ForLoadedTypes(anInterface));
}
Creates a new java type representation.
Params: - typeName – The binary name of this type.
- modifiers – The modifiers of this type when creating a stub.
- superClass – The super class of this type when creating a stub.
- anInterface – The interfaces of this type when creating a stub.
/**
* Creates a new java type representation.
*
* @param typeName The binary name of this type.
* @param modifiers The modifiers of this type when creating a stub.
* @param superClass The super class of this type when creating a stub.
* @param anInterface The interfaces of this type when creating a stub.
*/
JavaType(String typeName, int modifiers, TypeDefinition superClass, TypeDefinition... anInterface) {
this(typeName, modifiers, superClass == null
? TypeDescription.Generic.UNDEFINED
: superClass.asGenericType(), new TypeList.Generic.Explicit(anInterface));
}
Creates a new java type representation.
Params: - typeName – The binary name of this type.
- modifiers – The modifiers of this type when creating a stub.
- superClass – The super class of this type when creating a stub.
- interfaces – The interfaces of this type when creating a stub.
/**
* Creates a new java type representation.
*
* @param typeName The binary name of this type.
* @param modifiers The modifiers of this type when creating a stub.
* @param superClass The super class of this type when creating a stub.
* @param interfaces The interfaces of this type when creating a stub.
*/
JavaType(String typeName, int modifiers, TypeDescription.Generic superClass, TypeList.Generic interfaces) {
typeDescription = new TypeDescription.Latent(typeName, modifiers, superClass, interfaces);
}
Returns at least a stub representing this type where the stub does not define any methods or fields. If a type exists for
the current runtime, a loaded type representation is returned.
Returns: A type description for this Java type.
/**
* Returns at least a stub representing this type where the stub does not define any methods or fields. If a type exists for
* the current runtime, a loaded type representation is returned.
*
* @return A type description for this Java type.
*/
public TypeDescription getTypeStub() {
return typeDescription;
}
Loads the class that is represented by this Java type.
Throws: - ClassNotFoundException – If the represented type cannot be loaded.
Returns: A loaded type of this Java type.
/**
* Loads the class that is represented by this Java type.
*
* @return A loaded type of this Java type.
* @throws ClassNotFoundException If the represented type cannot be loaded.
*/
@CachedReturnPlugin.Enhance("loaded")
public Class<?> load() throws ClassNotFoundException {
return Class.forName(typeDescription.getName(), false, ClassLoadingStrategy.BOOTSTRAP_LOADER);
}
Loads the class that is represented by this Java type and represents it as a TypeDescription
. Throws: - ClassNotFoundException – If the represented type cannot be loaded.
Returns: A loaded type of this Java type.
/**
* Loads the class that is represented by this Java type and represents it as a {@link TypeDescription}.
*
* @return A loaded type of this Java type.
* @throws ClassNotFoundException If the represented type cannot be loaded.
*/
public TypeDescription loadAsDescription() throws ClassNotFoundException {
return TypeDescription.ForLoadedType.of(load());
}
Returns true
if this type is available on the current JVM. Returns: true
if this type is available on the current JVM.
/**
* Returns {@code true} if this type is available on the current JVM.
*
* @return {@code true} if this type is available on the current JVM.
*/
@CachedReturnPlugin.Enhance("available")
public boolean isAvailable() {
try {
load();
return true;
} catch (ClassNotFoundException ignored) {
return false;
}
}
Checks if the supplied object is an instance of this type.
Params: - instance – The instance to check.
Returns: true
if the supplied object is an instance of this type.
/**
* Checks if the supplied object is an instance of this type.
*
* @param instance The instance to check.
* @return {@code true} if the supplied object is an instance of this type.
*/
public boolean isInstance(Object instance) {
if (!isAvailable()) {
return false;
}
try {
return load().isInstance(instance);
} catch (ClassNotFoundException ignored) {
return false;
}
}
}