- - PR -
URLClassLoaderとgetMethodについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-15 21:06
てまです。
ぬし&ベテランの皆様ありがとうございます nagise様のヒントを元に以下のコードをScreenControlクラスに追加してみました
面白い結果がでました [Javaコマンド] D:\My Program\classLoad\classes>java loader.TestMain ClassLoader1=null ClassLoader2=null ClassLoader3=sun.misc.Launcher$AppClassLoader@a90653 ClassLoader4=sun.misc.Launcher$AppClassLoader@a90653 ret1=12 ret2=12 ret3=12 [Swing] D:\My Program\classLoad\classes>java loader.JFrameTest ClassLoader1=null ClassLoader2=null ClassLoader3=sun.misc.Launcher$AppClassLoader@a90653 ClassLoader4=sun.misc.Launcher$AppClassLoader@a90653 ret1=12 ret2=12 ret3=12 [IEプラグイン] ClassLoader1=null ClassLoader2=null ClassLoader3=sun.plugin.security.PluginClassLoader@73a34b ClassLoader4=java.net.URLClassLoader@92bbba java.lang.NoSuchMethodException: loader.OptionClass.calc(loader.DummyViews) at java.lang.Class.getMethod(Unknown Source) at loader.ScreenControl.run(ScreenControl.java:67) at loader.RootInit.init(RootInit.java:12) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) ご指摘のとおりでした ブラウザプラグインのときのみ 前者のDummyViewsと後者のDummyViewsは別々のクラスローダーから取得されています よってinvokeメソッドを次のように変えて解決することができました <前> ret3 = calc3.invoke(object, new Object[]{ new DummyViews(3)}); <↓後> Constructor cot = dmyClazz.getConstructor( new Class[]{int.class} ); ret3 = calc3.invoke(object, new Object[]{ cot.newInstance( new Object[]{ 3 })}); 出処がたとえ同じクラスでも、取得経路が違えば異なるクラスと判断することがわかりました |