【发布时间】:2014-03-04 23:25:41
【问题描述】:
我有一些课A:
public class A {
public A(String str) {
System.out.println("Create A instance: " + str);
}
public void methodA() {
System.out.println("#methodA1()");
}
}
还有我的类加载器实现:
public class MyClassLoader extends ClassLoader {
public MyClassLoader() {
super();
}
@Override
public synchronized Class<?> loadClass(String name)
throws ClassNotFoundException {
System.out.println("Load: " + name);
return super.loadClass(name);
}
}
现在我尝试更改当前线程中的默认类加载器:
import java.util.ArrayList;
import java.util.List;
public class ChangeLoaderTest {
public static void main(String[] args) {
// Save class loader so that we can restore later.
ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
MyClassLoader newLoader = new MyClassLoader();
try {
// Set new classloader.
Thread.currentThread().setContextClassLoader(newLoader);
// My class.
A a = new A("1");
a.methodA();
// Standard Java class.
List<Integer> list = new ArrayList<Integer>();
list.add(2);
list.add(3);
} finally {
// Restore.
Thread.currentThread().setContextClassLoader(oldLoader);
}
}
}
和ChangeLoaderTest 输出:
Create A instance: 1
#methodA1()
没有人
Load: ...
为什么?如何将ClassLoader 更改为某个线程?
【问题讨论】:
-
“我有一些 A 类:” 虽然有些人认为将问题“抽象”到可以表达为钝符号的程度更好,但我更喜欢一些有助于解释类
A中的内容的上下文,这使您想要动态加载它。 IE。A类可能是UserDefinedPlugIn- 后者提供了一些上下文,前者没有。 -
好的,我可以解释一下这个问题的上下文。我有将图像读入
BufferedImage的课程。有时是ImageIO.read(file),有时是Sanselan.getBufferedImage(file)。我有自己的保存图像的类,我应该从文件创建BuffredImage,然后将数据从BufferedImage复制到我的对象。我想使用一些代理类来捕获所有#get(...)方法调用以将信息保存在我的对象中。
标签: java classloader