###前提・実現したいこと
javaにて、iniファイルからJFrame型を継承するクラス名を取得し特定の名称のメソッドを実行したい
###発生している問題・エラーメッセージ
まだjavaの学習を始めて1週間そこらですが私用にツールを作成しています。
その際、ソースの書き方について解らない所が有り質問させて頂きます。
■ソース階層
/pre/tls/clk/openview.java
/pre/tls/mytls.java
/pre/lay/view1.java
/pre/ini/cnfg.ini
■質問
上記[■ソース階層]のファイルが存在し、[cnfig.ini]より文字列としてJFrame型を継承する[view1.java]のクラス名としての[pre.lay.view1]という値を取得し、
[view1]クラスの[hoge]メソッドを実行するには[openview.java]にどの様に書いたら良いのでしょうか?
###該当のソースコード
Java
■[openview.java]///////////////////////////////////////// package pre.tls; import pre.tls.*; import pre.tls.mytls; import pre.lay.*; import java.util.Properties; public class openview{ public void main(String args[]){ Properties prtys = new Properties(); prtys = mytls.iniload("pre/ini/cnfg.ini"); String paTh = prtys.getProperty("view1pah"); /***以下を書き換える try{ Class<?> clzz = Class.forName(paTh); Method mthd = clzz.getMethod("hoge"); mthd.invoke(clzz.newInstance()); } catch(ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e2){ e2.printStackTrace(); } 以上まで書き換える***/ } } ■[mytls.java]/////////////////////////////////////////////// package pre.tls; import java.net.UnknownHostException; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties; public class mytls{ public static Properties iniload(String viwsPath){ Properties prty = new Properties(); try{ InputStream inPut = new FileInputStream(viwsPath); prty.load(inPut); inPut.close(); } catch(Exception e){ System.out.println(e.getMessage()); } return prty; } ■[view1.java]/////////////////////////////////////////////// package pre.lay import java.awt.Container; import java.awt.*; import javax.swing.*; import javax.swing.JFrame; import java.awt.*; public class view1 extends JFrame{ public static hoge(){ view1 frame = new view1("hogehoge"); frame.setVisible(true); } view1(String title){ setTitle(title); setBounds(100,100,100,100); } } ■[cnfg.ini]/////////////////////////////////////////////////// view1pah=pre.lay.view1
###試したこと①
takasima20様から教えて頂いたURLを元に
/*** ***/内を以下の様に書き換えました
■ソース
try{
Class<?> clzz = Class.forName(paTh);
Constructor<?> cnst = clzz.getConstructor(new Class<?>[?]);
Method mthd = clzz.getMethod("hoge");
mthd.invoke(cnst.newInstance());
} catch(ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e2){
e2.printStackTrace();
}
■結果
コンパイルは正常に終了し、実行した所以下のエラーが出力されました
java.lang.NoSuchMethodException: pre.lay.view1.<init>()
また、大量に view1にてimportしているパッケージが見つからないというエラーも出力されています。
###試したこと②
試したこと①の結果を元に対象のクラスが参照できていないと推測し、以下の箇所にて、[System.out.println]にて確認した。
■確認箇所①
Class<?> clzz = Class.forName(paTh);
結果->期待値である[pre.lay.view1]が出力された。
■確認場所②
Constructor<?> cnst = clzz.getConstructor(new Class<?>[?]);
結果->試したこと①にて発生したエラーが出力された。
###試したこと③
回答者様の指摘を受け色々試しましたがうまく実行出来ませんでした。
本件の前段階として、GUI表示ではなくCUI上にてテキストを出力するソースを書いておりそれと照らし合わせ順に変更箇所を追加して実行しました。
■結果
[view1.java]にて、[view1]メソッドに[praivate void]と先頭に追加した所正常に実行できました。
■推測
公的になっていた[view1]コンストラクターが[getConstructor]を実行した為、初期化されてしまったものと思います。
間違っておりましたらご指摘ください。
###補足情報(言語/FW/ツール等のバージョンなど)
■正常に実行できたソースは解答欄に記入致します。
■使用言語
Java
■使用ツール
サクラエディタ
コマンドプロンプト
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。