org.springsource.loaded.ri.Exceptions Maven / Gradle / Ivy
/*
* Copyright 2010-2012 VMware and contributors
*
* 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.springsource.loaded.ri;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.objectweb.asm.Type;
/**
* Utility class to create correctly formatted Exceptions and Errors for different kinds of error conditions.
*
* @author Kris De Volder
* @since 0.5.0
*/
public class Exceptions {
static IllegalAccessException illegalSetFinalFieldException(Field field, Class> valueType, Object value) {
// Example of error when setting a primitive type final field:
// Can not set final short field reflection.nonrelfields.NonReloadableClassWithFields.nrlShort to (short)2
String fieldType = field.getType().getName();
String fieldQName = field.getDeclaringClass().getName() + "." + field.getName();
String valueString;
if (value == null) {
valueString = "null value";
} else if (valueType.isPrimitive()) {
valueString = "(" + valueType.getName() + ")" + value;
} else {
valueString = value == null ? "null value" : value.getClass().getName();
}
return new IllegalAccessException("Can not set final " + fieldType + " field " + fieldQName + " to " + valueString);
}
static IllegalArgumentException illegalSetFieldTypeException(Field field, Class> valueType, Object value) {
int mods = field.getModifiers() & (Modifier.FINAL | Modifier.STATIC);
String modStr = Modifier.toString(mods);
if (!modStr.equals("")) {
modStr = modStr + " ";
}
String fieldType = field.getType().getName();
String fieldQName = field.getDeclaringClass().getName() + "." + field.getName();
String valueStr;
if (valueType == null) {
valueStr = "null value";
} else if (valueType.isPrimitive()) {
valueStr = "(" + valueType.getName() + ")" + value;
} else {
valueStr = valueType.getName();
}
return new IllegalArgumentException("Can not set " + modStr + fieldType + " field " + fieldQName + " to " + valueStr);
}
public static NoSuchFieldError noSuchFieldError(Field field) {
return new NoSuchFieldError(field.getName());
}
public static NoSuchMethodError noSuchMethodError(Method method) {
return Exceptions.noSuchMethodError(method.getDeclaringClass().getName(), method.getName(),
Type.getMethodDescriptor(method));
}
public static NoSuchMethodError noSuchMethodError(String dottedClassName, String methodName, String methodDescriptor) {
return new NoSuchMethodError(dottedClassName + "." + methodName + methodDescriptor);
}
static NoSuchMethodException noSuchMethodException(Class> clazz, String name, Class>... params) {
return new NoSuchMethodException(clazz.getName() + "." + name + ReflectiveInterceptor.toParamString(params));
}
static NoSuchFieldException noSuchFieldException(String name) {
return new NoSuchFieldException(name);
}
public static IllegalArgumentException illegalGetFieldType(Field field, Class> returnType) {
String fieldQName = field.getDeclaringClass().getName() + "." + field.getName();
String returnTypeName = returnType.getName();
String fieldType = field.getType().getName();
return new IllegalArgumentException("Attempt to get " + fieldType + " field \"" + fieldQName
+ "\" with illegal data type conversion to " + returnTypeName);
}
public static NoSuchMethodException noSuchConstructorException(Class> clazz, Class>[] params) {
return noSuchMethodException(clazz, "", params);
}
public static NoSuchMethodError noSuchConstructorError(Constructor> c) {
//Example error message from Sun JVM:
// Exception in thread "main" java.lang.NoSuchMethodError: blah.Target.(CC)V
// at Main.main(Main.java:10)
return new NoSuchMethodError(c.getDeclaringClass().getName() + "." + Type.getConstructorDescriptor(c));
}
public static InstantiationException instantiation(Class> clazz) {
return new InstantiationException(clazz.getName());
}
}