2017-07-24 26 views
0

Java會拋出什麼可能的原因動態加載類時無法投射異常?轉換爲同一對象時發生ClassCastException

例子:

String classToLoad = null; 
    try { 
     classToLoad = extractMainClassManifest(jar); 
     LOGGER.info("Class to load: " + classToLoad); 
     JarByteClassloader loader = new JarByteClassloader(jar); 
     // e.g. class MyJarEntryObject extends JarEntryObject 
     Class c = loader.loadClass(classToLoad); 
     JarEntryObject jarEntry = (JarEntryObject) c.newInstance(); 
     // other stuff 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

如果這個代碼拋出的錯誤,我不認爲有另一個類加載器在這裏(多類加載器的情況下)。與的JUnit運行,或者只是在一個的main()方法運行時,

此代碼工作正常。

java.lang.ClassCastException: com.mywebapp.example.MyJarEntryObject cannot be cast to com.mysdk.JarEntryObject 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Router.doHandle(Router.java:422) 
    at org.restlet.routing.Router.handle(Router.java:641) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202) 
    at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:77) 
    at org.restlet.Application.handle(Application.java:385) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Router.doHandle(Router.java:422) 
    at org.restlet.routing.Router.handle(Router.java:641) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.routing.Router.doHandle(Router.java:422) 
    at org.restlet.routing.Router.handle(Router.java:641) 
    at org.restlet.routing.Filter.doHandle(Filter.java:150) 
    at org.restlet.routing.Filter.handle(Filter.java:197) 
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202) 
    at org.restlet.Component.handle(Component.java:408) 
    at org.restlet.Server.handle(Server.java:507) 
    at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:63) 
    at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:143) 
    at org.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:1117) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206) 
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:324) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 
+1

還有另外一個類加載器在這裏。你已經有'JarByteClassloader'加載類,並且默認的ClassLoader提供了編譯時'JarEntryObject'。 –

+1

'JarByteClassloader'是否委託給它的父代?它*有*父母嗎?如果沒有,@PaulHicks正確地暗示了這個問題。 –

+0

@KevinKrumwiede類是這樣的:'public class JarByteClassloader extends ClassLoader' – xybrek

回答

1

它看起來像你的JarByteClassloader不加入默認的類加載器的層次:一個Servlet容器中運行時(例如mvn jetty:run

登錄出現偏色問題。確保構造函數調用super(ClassLoader)。像這樣的東西可能會奏效:

public class JarByteClassloader extends ClassLoader { 
    public JarByteClassloader(Object objectLoadedByDefaultClassLoader) { 
    super(objectLoadedByDefaultClassLoader.getClass().getClassLoader()); 
    } 
} 

既然你已經傳入,是由默認的類加載器加載一個jar,大功告成!

其實,我只是記得getSystemClassLoader(),所以這段代碼可能是更好的,更自我記錄:

public class JarByteClassloader extends ClassLoader { 
    public JarByteClassloader() { 
    super(ClassLoader.getSystemClassLoader()); 
    } 
} 
+0

什麼可能的原因,即使不使用靜態'main'函數運行代碼時你共享代碼工作正常嗎? – xybrek

+0

順便說一句,JarByteClassloader與這裏的類加載器非常相似:https://stackoverflow.com/questions/16602668/creating-a-classloader-to-load-a-jar-file-from-a-byte-array – xybrek

+0

添加超級方法不會修復。 – xybrek

相關問題