
がmain内で所属クラスを呼び出すときにクラス名を記述しなくてもよい方法はないでしょうか?
Class A
{
ArrayList<String> x;
public A(){}
private void methodx(){...}
.........
static void main(String args)
{
A mya=new A();
.......
}
}
Class A を Class B に変更したらmain内の2カ所のAをBに置き換えなればなりません
Aを何にかえてもmain内のAを書き換えなくても良い方法はないでしょうか?
No.4ベストアンサー
- 回答日時:
リフレクションの仕組みを使って、メタ情報から生成して実行しましょう
var st = new Throwable().getStackTrace();
var cn = st[0].getClassName(); // 今現在のクラス名を取得
var c = Class.forName(cn);
var m = c.getMethod("methodx", Integer.TYPE);
// A o = new A();
Object o = c.getDeclaredConstructor().newInstance();
// T r = o.methodx(123);
Object r = m.invoke(o, 123);
参考)
https://docs.oracle.com/javase/jp/21/docs/api/ja …
https://docs.oracle.com/javase/jp/21/docs/api/ja …
完璧な回答ありがとうございます
var st = new Throwable().getStackTrace();
var cn = st[0].getClassName(); // 今現在のクラス名を取得
var c = Class.forName(cn);//?
var m = c.getMethod("methodx", Integer.TYPE);
// A mya = new A();
Object mya = c.getDeclaredConstructor().newInstance();
// T r = o.methodx(123);?
Object r = m.invoke(o, 123);//?
で完全に動作しました
ただ
var m = c.getMethod("methodx", Integer.TYPE);
// T r = o.methodx(123);
Object r = m.invoke(o, 123);
の意味が分かりません
これは必要なのでしょうか?
完璧な回答ありがとうございます
var st = new Throwable().getStackTrace();
var cn = st[0].getClassName(); // 今現在のクラス名を取得
var c = Class.forName(cn);//?
var m = c.getMethod("methodx", Integer.TYPE);
// A mya = new A();
Object mya = c.getDeclaredConstructor().newInstance();
// T r = o.methodx(123);?
Object r = m.invoke(o, 123);//?
で完全に動作しました
ただ
var m = c.getMethod("methodx", Integer.TYPE);
// T r = o.methodx(123);
Object r = m.invoke(o, 123);
の意味が分かりません
これは必要なのでしょうか?
No.2
- 回答日時:
Class A の動作確認用としてメンバに main() を持たせたのだとしたら、
その main() に A mya=new A(); という行が登場するのは
当然で、避けられないと思います。こればっかりは、JAVA の言語仕様
なので、どうにもなりません。
No.1
- 回答日時:
static void main(String) をメンバに持つクラスの
インスタンスを生成するような設計自体がまずいのではないでしょうか。
クラスを切り分けて、下記のようにするとよいかと思います。
Class A
{
ArrayList<String> x;
public A(){}
private void methodx(){...}
.........
}
Class Dummy
{
static void main(String args)
{
A mya=new A();
.......
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Googleログインボタンのデザイ...
-
googleスプレッドシートのスク...
-
jdbcでinsert,delete,createをe...
-
プログラミングの問題です。大...
-
配列にnullを代入すると、null...
-
JDONWROADER2のエラー修復
-
スプレッドシートからリマイン...
-
googleスプレッドシートのGASに...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
-
ショートカットキーについて
-
list の空は [] ってあわらすのに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Googleログインボタンのデザイ...
-
JDONWROADER2のエラー修復
-
googleスプレッドシートのGASに...
-
プログラミングの問題です。大...
-
JaneStyleのスレッドが見れなく...
-
Eclipse 動的プロジェクトで404...
-
次のhtml・cssでspan内の文字を...
-
「main メソッドを持つクラスが...
-
ゲーム開発の入門書を探しています
-
正規表現について質問です。 カ...
-
マイクラでPythonのプログラミ...
-
JAの支部?地域の農協のカード...
-
配列にnullを代入すると、null...
-
jdk17.06のインストーラーが起...
-
下記問題の答えが"D"になる意味...
-
結果的につかあなかったけど
-
jdbcでinsert,delete,createをe...
-
googleスプレッドシートのスク...
-
eclipse実行ができない
-
eclipseで作ったプログラムを他...
おすすめ情報
回答ありがとうございます
大幅に省略して分かり易く単純クラスで記述したのですが実際の実装は違います
Class Aは実は3000ステップ以上のサーブレットです
static mainはプログラミング完了時に破棄する動作チェック用の一時要素です
サーバ付で実行するときにはmainは無視され本番の動作をし
サーバ無で実行するときには検査用にmainが実行されます
mainで本番のメソッドの動作チェックをするのです
static mainでは直接にクラスやクラスのメソッドにアクセスできないので
main内でサーブレットをnewしてそれによりサーブレット配下の変数、メソッドにアクセスしてチェックしているのです
クラス外からチェックだと自クラスのようにチェックできないので自分の体を検査するようにできないので限界があります
御礼を間違ってしました
失礼しました