最近在做一个实验是这样的,用了javassist的Loader建了一个ParentClassLoader并且extends出两个ChildClassLoader作专门的classloader使用。 ParentClassLoader 装载Handler 两个ChildClassLoader分别装载Employer和Worker。Handler做老板和工人之间的reflection。Main程序的目的是让两个不通classloader中的方法可以相互调用,并且返回结果(Yeah, I know its fucking crazy, but...u know Boss is rubish but also everything to me...)。
很简单的程序。
public class Employer {
public Employer(){}
public void work throws Throwable {
Main.handler.work();
}
} public class Handler implements InvocationHandler, IWork { public Handler(){} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { Object obj = method.invoke(Main.worker, args); return obj;
} public void work() {
try {
invoke(this, Main.worker.getClass().getMethod("work"), null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
} }
}
public class Worker implements IWork { public Worker(){}
public void work() {
System.out.println(" working...");
}
}
Crazy Main classpublic class Main {
public static Object handler;
public static Object employer;
public static Object worker;
public static void setStaticVar(Class Handler,Class Employer,Class Worker){
try {
handler = Handler.newInstance();
employer = Employer.newInstance();
worker = Worker.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String []args){
try {
ParentClassLoader ploader = new ParentClassLoader();
ChildClassLoader cloader1 = new ChildClassLoader(ploader);
ChildClassLoader cloader2 = new ChildClassLoader(ploader);
Class Handler = ploader.loadClass("my.simple.Handler");
Class Employer = cloader1.loadClass("my.simple.Employer");
Class Worker = cloader2.loadClass("my.simple.Worker");
setStaticVar(Handler,Employer,Worker);
Method handlerMethod = handler.getClass().getMethod("work", null);
Object o = handlerMethod.invoke(handler);
}
}Handler中的invoke报错java.lang.NullPointerException 十分不明白什么原因。另外,跨classloader的类方法调用该如何处理?望高手!
很简单的程序。
public class Employer {
public Employer(){}
public void work throws Throwable {
Main.handler.work();
}
} public class Handler implements InvocationHandler, IWork { public Handler(){} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { Object obj = method.invoke(Main.worker, args); return obj;
} public void work() {
try {
invoke(this, Main.worker.getClass().getMethod("work"), null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
} }
}
public class Worker implements IWork { public Worker(){}
public void work() {
System.out.println(" working...");
}
}
Crazy Main classpublic class Main {
public static Object handler;
public static Object employer;
public static Object worker;
public static void setStaticVar(Class Handler,Class Employer,Class Worker){
try {
handler = Handler.newInstance();
employer = Employer.newInstance();
worker = Worker.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String []args){
try {
ParentClassLoader ploader = new ParentClassLoader();
ChildClassLoader cloader1 = new ChildClassLoader(ploader);
ChildClassLoader cloader2 = new ChildClassLoader(ploader);
Class Handler = ploader.loadClass("my.simple.Handler");
Class Employer = cloader1.loadClass("my.simple.Employer");
Class Worker = cloader2.loadClass("my.simple.Worker");
setStaticVar(Handler,Employer,Worker);
Method handlerMethod = handler.getClass().getMethod("work", null);
Object o = handlerMethod.invoke(handler);
}
}Handler中的invoke报错java.lang.NullPointerException 十分不明白什么原因。另外,跨classloader的类方法调用该如何处理?望高手!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货