public class BytecodeHelper extends Object
Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you 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.
Type | Name and description |
---|---|
static boolean |
box(org.objectweb.asm.MethodVisitor mv, ClassNode type) box top level operand |
static boolean |
box(org.objectweb.asm.MethodVisitor mv, Class type) Generates the bytecode to autobox the current value on the stack |
static void |
doCast(org.objectweb.asm.MethodVisitor mv, ClassNode type) |
static void |
doCast(org.objectweb.asm.MethodVisitor mv, Class type) |
static void |
doCastToPrimitive(org.objectweb.asm.MethodVisitor mv, ClassNode sourceType, ClassNode targetType) Given a wrapped number type (Byte, Integer, Short, ...), generates bytecode to convert it to a primitive number (int, long, double) using calls to wrapped. |
static void |
doCastToWrappedType(org.objectweb.asm.MethodVisitor mv, ClassNode sourceType, ClassNode targetType) Given a primitive number type (byte, integer, short, ...), generates bytecode to convert it to a wrapped number (Integer, Long, Double) using calls to [WrappedType].valueOf |
static void |
doReturn(org.objectweb.asm.MethodVisitor mv, ClassNode returnType) |
static String |
formatNameForClassLoading(String name) load a message on the stack and remove it right away. |
static String |
getClassInternalName(ClassNode t) |
static String |
getClassInternalName(Class t) |
static String |
getClassInternalName(String name) @return the ASM internal name of the type |
static String[] |
getClassInternalNames(ClassNode[] names) @return an array of ASM internal names of the type |
static String |
getClassLoadingTypeDescription(ClassNode c) array types are special: eg.: String[]: classname: [Ljava.lang.String; Object: classname: java.lang.Object int[] : classname: [I unlike getTypeDescription '.' is not replaced by '/'. |
static String |
getGenericsBounds(ClassNode type) |
static String |
getGenericsMethodSignature(MethodNode node) |
static String |
getGenericsSignature(ClassNode node) |
static String |
getMethodDescriptor(ClassNode returnType, Parameter[] parameters) |
static String |
getMethodDescriptor(MethodNode methodNode) Returns a method descriptor for the given MethodNode. |
static String |
getMethodDescriptor(Class returnType, Class[] paramTypes) @return the ASM method type descriptor |
static String |
getTypeDescription(Class c) |
static String |
getTypeDescription(ClassNode c) array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I |
static int |
hashCode(String str) Computes a hash code for a string. |
static boolean |
isClassLiteralPossible(ClassNode classNode) Tells if a class node is candidate for class literal bytecode optimization. |
static boolean |
isSameCompilationUnit(ClassNode a, ClassNode b) Returns true if the two classes share the same compilation unit. |
static void |
load(org.objectweb.asm.MethodVisitor mv, ClassNode type, int idx) |
static void |
negateBoolean(org.objectweb.asm.MethodVisitor mv) negate a boolean on stack. true->false, false->true |
static void |
pushConstant(org.objectweb.asm.MethodVisitor mv, int value) |
static void |
unbox(org.objectweb.asm.MethodVisitor mv, Class type) Generates the bytecode to unbox the current value on the stack |
static void |
unbox(org.objectweb.asm.MethodVisitor mv, ClassNode type) |
static void |
visitClassLiteral(org.objectweb.asm.MethodVisitor mv, ClassNode classNode) Visits a class literal. |
box top level operand
Generates the bytecode to autobox the current value on the stack
Given a wrapped number type (Byte, Integer, Short, ...), generates bytecode to convert it to a primitive number (int, long, double) using calls to wrapped.[targetType]Value()
mv
- method visitorsourceType
- the wrapped number typetargetType
- the primitive target typeGiven a primitive number type (byte, integer, short, ...), generates bytecode to convert it to a wrapped number (Integer, Long, Double) using calls to [WrappedType].valueOf
mv
- method visitorsourceType
- the primitive number typetargetType
- the wrapped target typeload a message on the stack and remove it right away. Good for put a mark in the generated bytecode for debugging purpose.
array types are special: eg.: String[]: classname: [Ljava.lang.String; Object: classname: java.lang.Object int[] : classname: [I unlike getTypeDescription '.' is not replaced by '/'. it seems that makes problems for the class loading if '.' is replaced by '/'
Returns a method descriptor for the given MethodNode.
methodNode
- the method node for which to create the descriptor
array types are special: eg.: String[]: classname: [Ljava/lang/String; int[]: [I
Computes a hash code for a string. The purpose of this hashcode is to be constant independently of the JDK being used.
str
- the string for which to compute the hashcodeTells if a class node is candidate for class literal bytecode optimization. If so, bytecode may use LDC instructions instead of static constant Class fields to retrieve class literals.
classNode
- the classnode for which we want to know if bytecode optimization is possibleReturns true if the two classes share the same compilation unit.
a
- class ab
- class bnegate a boolean on stack. true->false, false->true
Generates the bytecode to unbox the current value on the stack
Visits a class literal. If the type of the classnode is a primitive type, the generated bytecode will be a GETSTATIC Integer.TYPE. If the classnode is not a primitive type, we will generate a LDC instruction.