i want write own custom class loader before loading classes. following code can work if main class want invoke simple. example, if invoked main method print messages, work fine without error. however, if invokes complicated main method, example, main method in 'com.iisi.rest.start' create http server using jersey below, failed.
httpserver server = httpserverfactory.create("http://127.0.0.1:10987/rest"); server.start(); it's not problem of classes want load, because if comment out code below , let findsystemclass() method load classes, work well.
claz = defineclass(name, classdata, 0, classdata.length); i've been searched answer long time, , still can't figure out...
public class myclassloader extends classloader { @suppresswarnings({ "rawtypes", "unchecked" }) public static void main(string[] args) { myclassloader myloader = new myclassloader(); class claz; string realargs[] = new string[0]; try { claz = myloader.loadclass("com.iisi.rest.start", true); // claz = myloader.loadclass("com.iisi.practice.test", true); class[] mainargs = { (new string[1]).getclass() }; method main = claz.getmethod("main", mainargs); object[] argsarray = { realargs }; main.invoke(null, argsarray); } catch (exception e) { e.printstacktrace(); } } @override @suppresswarnings({ "rawtypes" }) public class<?> loadclass(string name, boolean resolve) throws classnotfoundexception { class claz = null; claz = findloadedclass(name); if (claz != null) { return claz; } try { byte[] classdata = readfile(name); if (classdata != null) { claz = defineclass(name, classdata, 0, classdata.length); if (claz != null) { system.out.println(name + " loaded myclassloader"); } } } catch (filenotfoundexception e) { system.out.println(e.getmessage()); } catch (exception e) { system.out.println(e.getmessage()); } catch (classformaterror e) { system.out.println(e.getmessage()); } if (claz == null) { claz = findsystemclass(name); if (claz != null) { system.out.println(name + " loaded system class loader"); } } // check if (claz == null) { system.out.println(name + " failed"); } if (resolve && claz != null) { resolveclass(claz); } return claz; } } below partial error messages...
com.sun.jersey.localization.localizable loaded myclassloader com.sun.jersey.localization.localizer loaded myclassloader java.util.missingresourceexception loaded system class loader java.util.locale loaded system class loader com.sun.jersey.localization.localizablemessage loaded myclassloader java.util.resourcebundle loaded system class loader java.text.messageformat loaded system class loader java.lang.reflect.invocationtargetexception @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:57) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) @ java.lang.reflect.method.invoke(method.java:606) @ com.iisi.formal.myclassloader.main(myclassloader.java:56) caused by: com.sun.jersey.spi.service.serviceconfigurationerror: com.sun.jersey.spi.container.webapplicationprovider: class com.sun.jersey.server.impl.container.webapplicationproviderimpl implementing provider interface com.sun.jersey.spi.container.webapplicationprovider not instantiated: cannot cast com.sun.jersey.server.impl.container.webapplicationproviderimpl com.sun.jersey.spi.container.webapplicationprovider @ com.sun.jersey.spi.service.servicefinder.fail(servicefinder.java:602) @ com.sun.jersey.spi.service.servicefinder.access$800(servicefinder.java:159) @ com.sun.jersey.spi.service.servicefinder$lazyobjectiterator.hasnext(servicefinder.java:892) @ com.sun.jersey.spi.container.webapplicationfactory.createwebapplication(webapplicationfactory.java:64) @ com.sun.jersey.api.container.containerfactory.createcontainer(containerfactory.java:160) @ com.sun.jersey.api.container.containerfactory.createcontainer(containerfactory.java:264) @ com.sun.jersey.api.container.containerfactory.createcontainer(containerfactory.java:246) @ com.sun.jersey.api.container.httpserver.httpserverfactory.create(httpserverfactory.java:117) @ com.sun.jersey.api.container.httpserver.httpserverfactory.create(httpserverfactory.java:92) @ com.iisi.rest.start.main(start.java:47) ... 5 more caused by: java.lang.classcastexception: cannot cast com.sun.jersey.server.impl.container.webapplicationproviderimpl com.sun.jersey.spi.container.webapplicationprovider @ java.lang.class.cast(class.java:3176) @ com.sun.jersey.spi.service.servicefinder$lazyobjectiterator.hasnext(servicefinder.java:851) ... 12 more
Comments
Post a Comment