use of org.apache.xbean.asm9.ClassReader in project jodd by oblac.
the class Paramo method resolveParameters.
/**
* Resolves method parameters from a method or constructor.
* Returns an empty array when target does not contain any parameter.
* No caching is involved in this process, i.e. class bytecode
* is examined every time this method is called.
*/
public static MethodParameter[] resolveParameters(AccessibleObject methodOrCtor) {
Class[] paramTypes;
Class declaringClass;
String name;
if (methodOrCtor instanceof Method) {
Method method = (Method) methodOrCtor;
paramTypes = method.getParameterTypes();
name = method.getName();
declaringClass = method.getDeclaringClass();
} else {
Constructor constructor = (Constructor) methodOrCtor;
paramTypes = constructor.getParameterTypes();
declaringClass = constructor.getDeclaringClass();
name = CTOR_METHOD;
}
if (paramTypes.length == 0) {
return MethodParameter.EMPTY_ARRAY;
}
InputStream stream;
try {
stream = ClassLoaderUtil.getClassAsStream(declaringClass);
} catch (IOException ioex) {
throw new ParamoException("Failed to read class bytes: " + declaringClass.getName(), ioex);
}
if (stream == null) {
throw new ParamoException("Class not found: " + declaringClass);
}
try {
ClassReader reader = new ClassReader(stream);
MethodFinder visitor = new MethodFinder(declaringClass, name, paramTypes);
reader.accept(visitor, 0);
return visitor.getResolvedParameters();
} catch (IOException ioex) {
throw new ParamoException(ioex);
} finally {
StreamUtil.close(stream);
}
}
use of org.apache.xbean.asm9.ClassReader in project intellij-community by JetBrains.
the class AbstractClassGenerator method create.
protected Object create(Object key) {
try {
Class gen = null;
synchronized (source) {
ClassLoader loader = getClassLoader();
Map cache2 = null;
cache2 = (Map) source.cache.get(loader);
if (cache2 == null) {
cache2 = new HashMap();
cache2.put(NAME_KEY, new HashSet());
source.cache.put(loader, cache2);
} else if (useCache) {
Reference ref = (Reference) cache2.get(key);
gen = (Class) SoftReference.dereference(ref);
}
if (gen == null) {
Object save = CURRENT.get();
CURRENT.set(this);
try {
this.key = key;
if (attemptLoad) {
try {
gen = loader.loadClass(getClassName());
} catch (ClassNotFoundException e) {
// ignore
}
}
if (gen == null) {
byte[] b = strategy.generate(this);
String className = ClassNameReader.getClassName(new $ClassReader(b));
getClassNameCache(loader).add(className);
gen = ReflectUtils.defineClass(className, b, loader);
}
if (useCache) {
cache2.put(key, new WeakReference(gen));
}
return firstInstance(gen);
} finally {
CURRENT.set(save);
}
}
}
return firstInstance(gen);
} catch (RuntimeException e) {
throw e;
} catch (Error e) {
throw e;
} catch (Exception e) {
throw new CodeGenerationException(e);
}
}
use of org.apache.xbean.asm9.ClassReader in project geronimo-xbean by apache.
the class XbeanAsmParameterNameLoader method getAllConstructorParameters.
/**
* Gets the parameter names of all constructor or null if the class was compiled without debug symbols on.
* @param clazz the class for which the constructor parameter names should be retrieved
* @return a map from Constructor object to the parameter names or null if the class was compiled without debug symbols on
*/
public Map<Constructor, List<String>> getAllConstructorParameters(Class clazz) {
// Determine the constructors?
List<Constructor> constructors = new ArrayList<Constructor>(Arrays.asList(clazz.getConstructors()));
constructors.addAll(Arrays.asList(clazz.getDeclaredConstructors()));
if (constructors.isEmpty()) {
return Collections.emptyMap();
}
// Check the cache
if (constructorCache.containsKey(constructors.get(0))) {
Map<Constructor, List<String>> constructorParameters = new HashMap<Constructor, List<String>>();
for (Constructor constructor : constructors) {
constructorParameters.put(constructor, constructorCache.get(constructor));
}
return constructorParameters;
}
// Load the parameter names using ASM
Map<Constructor, List<String>> constructorParameters = new HashMap<Constructor, List<String>>();
try {
ClassReader reader = XbeanAsmParameterNameLoader.createClassReader(clazz);
XbeanAsmParameterNameLoader.AllParameterNamesDiscoveringVisitor visitor = new XbeanAsmParameterNameLoader.AllParameterNamesDiscoveringVisitor(clazz);
reader.accept(visitor, 0);
Map exceptions = visitor.getExceptions();
if (exceptions.size() == 1) {
throw new RuntimeException((Exception) exceptions.values().iterator().next());
}
if (!exceptions.isEmpty()) {
throw new RuntimeException(exceptions.toString());
}
constructorParameters = visitor.getConstructorParameters();
} catch (IOException ex) {
}
// Cache the names
for (Constructor constructor : constructors) {
constructorCache.put(constructor, constructorParameters.get(constructor));
}
return constructorParameters;
}
use of org.apache.xbean.asm9.ClassReader in project geronimo-xbean by apache.
the class XbeanAsmParameterNameLoader method getAllMethodParameters.
/**
* Gets the parameter names of all methods with the specified name or null if the class was compiled without debug symbols on.
* @param clazz the class for which the method parameter names should be retrieved
* @param methodName the of the method for which the parameters should be retrieved
* @return a map from Method object to the parameter names or null if the class was compiled without debug symbols on
*/
public Map<Method, List<String>> getAllMethodParameters(Class clazz, String methodName) {
// Determine the constructors?
Method[] methods = getMethods(clazz, methodName);
if (methods.length == 0) {
return Collections.emptyMap();
}
// Check the cache
if (methodCache.containsKey(methods[0])) {
Map<Method, List<String>> methodParameters = new HashMap<Method, List<String>>();
for (Method method : methods) {
methodParameters.put(method, methodCache.get(method));
}
return methodParameters;
}
// Load the parameter names using ASM
Map<Method, List<String>> methodParameters = new HashMap<Method, List<String>>();
try {
ClassReader reader = XbeanAsmParameterNameLoader.createClassReader(clazz);
XbeanAsmParameterNameLoader.AllParameterNamesDiscoveringVisitor visitor = new XbeanAsmParameterNameLoader.AllParameterNamesDiscoveringVisitor(clazz, methodName);
reader.accept(visitor, 0);
Map exceptions = visitor.getExceptions();
if (exceptions.size() == 1) {
throw new RuntimeException((Exception) exceptions.values().iterator().next());
}
if (!exceptions.isEmpty()) {
throw new RuntimeException(exceptions.toString());
}
methodParameters = visitor.getMethodParameters();
} catch (IOException ex) {
}
// Cache the names
for (Method method : methods) {
methodCache.put(method, methodParameters.get(method));
}
return methodParameters;
}
use of org.apache.xbean.asm9.ClassReader in project tomee by apache.
the class TempClassLoader method isEnum.
/**
* Fast-parse the given class bytecode to determine if it is an
* enum class.
*/
private static boolean isEnum(final byte[] bytes) {
final IsEnumVisitor isEnumVisitor = new IsEnumVisitor();
final ClassReader classReader = new ClassReader(bytes);
classReader.accept(isEnumVisitor, ClassReader.SKIP_DEBUG);
return isEnumVisitor.isEnum;
}
Aggregations