/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.backend.java.utils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Logger;
import abs.backend.java.lib.runtime.ABSException;
import abs.backend.java.lib.runtime.Logging;
import abs.backend.java.lib.types.ABSValue;
public class DynamicClassUtils {
private static final Logger logger = Logging.getLogger(DynamicClassUtils.class.getName());
public static Class<?> getClass(String name) {
Class<?> cls;
try {
cls = Class.forName(name);
} catch (ClassNotFoundException e) {
throw new GeneratedClassLoadingException(e.toString());
}
return cls;
}
@SuppressWarnings("unchecked")
public static <T extends ABSValue> T instance(Class<?> cls, Object... args) {
String name = cls.getName();
if (cls.getDeclaredConstructors().length != 1)
logger.warning("Class " + name + " has either more than one, or zero constructors.");
Constructor<?> ctor = cls.getDeclaredConstructors()[0];
T result;
try {
result = (T) ctor.newInstance(args);
} catch (IllegalArgumentException e) {
throw new GeneratedClassLoadingException("Failed to instantiate class " + name + "\n" + e.toString());
} catch (InstantiationException e) {
throw new GeneratedClassLoadingException("Failed to instantiate class " + name + "\n" + e.toString());
} catch (IllegalAccessException e) {
throw new GeneratedClassLoadingException("Failed to instantiate class " + name + "\n" + e.toString());
} catch (InvocationTargetException e) {
throw new GeneratedClassLoadingException("Failed to instantiate class " + name + "\n" + e.toString());
}
return result;
}
public static <T extends ABSValue> T instance(String name, Object... args) {
Class<?> cls = getClass(name);
return instance(cls, args);
}
public static class GeneratedClassLoadingException extends ABSException {
public GeneratedClassLoadingException(String string) {
super(string);
}
private static final long serialVersionUID = 1261395931117319034L;
@Override
public String getName() {
return "Loading generated class failed";
}
}
}