重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

が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を書き換えなくても良い方法はないでしょうか?

質問者からの補足コメント

  • 回答ありがとうございます
    大幅に省略して分かり易く単純クラスで記述したのですが実際の実装は違います
    Class Aは実は3000ステップ以上のサーブレットです
    static mainはプログラミング完了時に破棄する動作チェック用の一時要素です
    サーバ付で実行するときにはmainは無視され本番の動作をし
    サーバ無で実行するときには検査用にmainが実行されます
    mainで本番のメソッドの動作チェックをするのです
    static mainでは直接にクラスやクラスのメソッドにアクセスできないので
    main内でサーブレットをnewしてそれによりサーブレット配下の変数、メソッドにアクセスしてチェックしているのです
    クラス外からチェックだと自クラスのようにチェックできないので自分の体を検査するようにできないので限界があります

      補足日時:2024/11/02 19:11
  • 御礼を間違ってしました
    失礼しました

    No.3の回答に寄せられた補足コメントです。 補足日時:2024/11/03 17:17

A 回答 (5件)

リフレクションの仕組みを使って、メタ情報から生成して実行しましょう



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 …
    • good
    • 0
この回答へのお礼

完璧な回答ありがとうございます

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);

の意味が分かりません
これは必要なのでしょうか?

お礼日時:2024/11/03 17:16

#4 のコードが何をしているか, 理解できていますか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます

var m = c.getMethod("methodx", Integer.TYPE);
Object r = m.invoke(o, 123);

部分以外は理解できますが、なぜこの2行を提示されたのかが分かりません

お礼日時:2024/11/03 18:25
この回答への補足あり
    • good
    • 1
この回答へのお礼

完璧な回答ありがとうございます

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);

の意味が分かりません
これは必要なのでしょうか?

お礼日時:2024/11/03 17:13

Class A の動作確認用としてメンバに main() を持たせたのだとしたら、


その main() に A mya=new A(); という行が登場するのは
当然で、避けられないと思います。こればっかりは、JAVA の言語仕様
なので、どうにもなりません。
    • good
    • 0

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();
.......
}
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!