默认的ClassPool通过static方法ClassPool.getDefault()返回与JVM一样的搜索路径。如果程序运行在一个web服务器,如JBoss,Tomcat,ClassPool对象可以找不到用户的类,因为web 服务器用多个类载入器(class loader)作为载入器。这种情况,附加的类路径必须注册到ClassPool。应该为pool 提供一个ClassPool 对象:
pool.insertClassPath(new ClassClassPath(this.getClass()));
这段程序注册了用来载入类对象的类路径。可以用任何类对象作为参数替换this.getClass()。注册的路径用来载入类 。
可以注册一个目录名作为类搜索路径。例如,下面的例子加入了一个目录/usr/local/javalib作为搜索路径:
ClassPool pool = ClassPool.getDefault();
pool.insertClassPath("/usr/local/javalib");
这个搜索路径不仅可以是目录,还可以是URL:
ClassPool pool = ClassPool.getDefault();
ClassPath cp = new URLClassPath("www.javassist.org", 80, "/java/", "org.javassist.");
pool.insertClassPath(cp);
这个程序加入”http://www.javassist.org:80/java/” 到类搜索路径。这个URL只是搜索属于org.javassist包的类。例如,载入org.javassist.test.Main,它的类文件将被得到:
http://www.javassist.org:80/java/org/javassist/test/Main.class
另外,可以直接把一个byte数组给一个ClassPool对象,构建一个CtClass对象从这个数组。用ByteArrayClassPath,例如:
ClassPool cp = ClassPool.getDefault();
byte[] b = a byte array;
String name = class name;
cp.insertClassPath(new ByteArrayClassPath(name, b));
CtClass cc = cp.get(name);
得到的CtClass对象表示通过b指定的一个类,ClassPool从ByteArrayClassPath读一个类文件,如果执行get(),需要用类名。
如果不知道类的全名,可以用ClassPool中的makeClass():ClassPool cp = ClassPool.getDefault();
InputStream ins = an input stream for reading a class file;
CtClass cc = cp.makeClass(ins);
makeClass()从输入流中返回CtClass对象。可以用makeClass()把想要修改的类放入ClassPool。如果搜索路径包括一个大的jar文件,它可以提高性能。当ClassPool需要读取一个类文件,它可以为每个类文件重复搜索整个jar文件夹。makeClass()可以有效的搜索。makeClass()构建的CtClass,保存在ClassPool,并且类文件不再被读。
用户可以扩展类搜索路径。可以定义一个实现ClassPath接口的新类,ClassPool的insertClassPath()给了一个类的实例。它允许一个非标准资源包含在搜索路径中。