public class ClasspathUtils extends Object
The basic idea behind this utility class is to use it from inside the different Ant objects (and user defined objects) that need classLoading for their operation. Normally those would have a setClasspathRef() {for the @classpathref} and/or a createClasspath() {for the nested <classpath>} Typically one would have in your Ant Task or DataType
ClasspathUtils.Delegate cpDelegate;
public void init() {
this.cpDelegate = ClasspathUtils.getDelegate(this);
super.init();
}
public void setClasspathRef(Reference r) {
this.cpDelegate.setClasspathRef(r);
}
public Path createClasspath() {
return this.cpDelegate.createClasspath();
}
public void setClassname(String fqcn) {
this.cpDelegate.setClassname(fqcn);
}
At execution time, when you actually need the classloading you can just:
Object o = this.cpDelegate.newInstance();
Modifier and Type | Class and Description |
---|---|
static class |
ClasspathUtils.Delegate
Delegate that helps out any specific ProjectComponent that needs
dynamic classloading.
|
Modifier and Type | Field and Description |
---|---|
static String |
REUSE_LOADER_REF
Name of the magic property that controls classloader reuse in Ant 1.4.
|
Constructor and Description |
---|
ClasspathUtils() |
Modifier and Type | Method and Description |
---|---|
static java.lang.ClassLoader |
getClassLoaderForPath(Project p,
Path path,
String loaderId)
Convenience overloaded version of
getClassLoaderForPath(Project, Path, String, boolean) . |
static java.lang.ClassLoader |
getClassLoaderForPath(Project p,
Path path,
String loaderId,
boolean reverseLoader)
Convenience overloaded version of
getClassLoaderForPath(Project, Path, String, boolean, boolean) . |
static java.lang.ClassLoader |
getClassLoaderForPath(Project p,
Path path,
String loaderId,
boolean reverseLoader,
boolean reuseLoader)
Gets a classloader that loads classes from the classpath
defined in the path argument.
|
static java.lang.ClassLoader |
getClassLoaderForPath(Project p,
Reference ref)
Convenience overloaded version of
getClassLoaderForPath(Project, Reference, boolean) . |
static java.lang.ClassLoader |
getClassLoaderForPath(Project p,
Reference ref,
boolean reverseLoader)
Convenience overloaded version of
getClassLoaderForPath(Project, Path,
String, boolean) . |
static ClasspathUtils.Delegate |
getDelegate(ProjectComponent component)
Obtains a delegate that helps out with classic classpath configuration.
|
static java.lang.ClassLoader |
getUniqueClassLoaderForPath(Project p,
Path path,
boolean reverseLoader)
Gets a fresh, different, previously unused classloader that uses the
passed path as its classpath.
|
static Object |
newInstance(String className,
java.lang.ClassLoader userDefinedLoader)
Creates a fresh object instance of the specified classname.
|
static Object |
newInstance(String className,
java.lang.ClassLoader userDefinedLoader,
Class expectedType)
Creates a fresh object instance of the specified classname.
|
public static final String REUSE_LOADER_REF
public static java.lang.ClassLoader getClassLoaderForPath(Project p, Path path, String loaderId)
getClassLoaderForPath(Project, Path, String, boolean)
.
Assumes the logical 'false' for the reverseLoader.
p
- current Ant projectpath
- the pathloaderId
- the loader id stringpublic static java.lang.ClassLoader getClassLoaderForPath(Project p, Path path, String loaderId, boolean reverseLoader)
getClassLoaderForPath(Project, Path, String, boolean, boolean)
.
Sets value for 'reuseLoader' to true if the magic property has been set.
p
- the projectpath
- the pathloaderId
- the loader id stringreverseLoader
- if set to true this new loader will take
precedence over its parent (which is contra the regular
classloader behaviour)public static java.lang.ClassLoader getClassLoaderForPath(Project p, Path path, String loaderId, boolean reverseLoader, boolean reuseLoader)
Based on the setting of the magic property 'ant.reuse.loader' this will try to reuse the previously created loader with that id, and of course store it there upon creation.
p
- Ant Project where the handled components are living in.path
- Path object to be used as classpath for this classloaderloaderId
- identification for this Loader,reverseLoader
- if set to true this new loader will take
precedence over its parent (which is contra the regular
classloader behaviour)reuseLoader
- if true reuse the loader if it is foundpublic static java.lang.ClassLoader getClassLoaderForPath(Project p, Reference ref)
getClassLoaderForPath(Project, Reference, boolean)
.
Assumes the logical 'false' for the reverseLoader.
p
- the projectref
- the referencepublic static java.lang.ClassLoader getClassLoaderForPath(Project p, Reference ref, boolean reverseLoader)
getClassLoaderForPath(Project, Path,
String, boolean)
.
Delegates to the other one after extracting the referenced Path from the Project. This checks also that the passed Reference is pointing to a Path all right.
p
- current Ant projectref
- Reference to Path structurereverseLoader
- if set to true this new loader will take
precedence over its parent (which is contra the regular
classloader behaviour)public static ClasspathUtils.Delegate getDelegate(ProjectComponent component)
component
- your projectComponent that needs the assistenceClasspathUtils.Delegate
public static java.lang.ClassLoader getUniqueClassLoaderForPath(Project p, Path path, boolean reverseLoader)
This method completely ignores the ant.reuse.loader magic property and should be used with caution.
p
- Ant Project where the handled components are living in.path
- the classpath for this loaderreverseLoader
- if set to true this new loader will take
precedence over its parent (which is contra the regular
classloader behaviour)public static Object newInstance(String className, java.lang.ClassLoader userDefinedLoader)
This uses the userDefinedLoader to load the specified class, and then makes an instance using the default no-argument constructor.
className
- the full qualified class name to load.userDefinedLoader
- the classloader to use.BuildException
- when loading or instantiation failed.public static Object newInstance(String className, java.lang.ClassLoader userDefinedLoader, Class expectedType)
This uses the userDefinedLoader to load the specified class, and then makes an instance using the default no-argument constructor.
className
- the full qualified class name to load.userDefinedLoader
- the classloader to use.expectedType
- the Class that the result should be assignment
compatible with. (No ClassCastException will be thrown in case
the result of this method is casted to the expectedType)BuildException
- when loading or instantiation failed.