最近、私は可能な限りstatic
のもの(変数とメソッド)を削除し、より良いコーディング慣行で置き換えることを試みる、鉱山のJavaコードを再構築しました。リフレクションVSスタティックstuff
私はまた、反射を勉強し始め、それがstatic
呼び出しや参照を最初に、私は唯一の実現可能性(あるいは、少なくとも、それは私がそれを見る方法です)、いくつかのものを行うために私を可能にすることに気づきました。
しかし、私はstatic
の使用はあまり推奨されていないことを読んできましたが、それは反射と同じではないようです。
static
というメソッドを作成してClassName.methodName()
のように呼び出すのではなく、それをインスタンスメソッドにしてjava.lang.reflect.Method.invoke()
で呼び出すのは正当な使用ですか?動的クラスのコンテンツにアクセスする
よう
ここでのサンプルコードです:動作します(しかし、私は方法static
をしたくない)
仮定の状況:
import static java.lang.System.out;
public class Foo
{
private static boolean light;
public Foo()
{
turnOn();
}
public static void turnOn()
{
light = true;
}
public static void turnOff()
{
light = false;
}
public static boolean isGreenLight()
{
return light;
}
}
public class Boo
{
public Boo()
{
if (Foo.isGreenLight()) // I need to access Foo.isGreenLight() from here, but cur-
{ // rently that method is not static (it should be to do so)
out.println("Ok!");
}
}
}
public final class Main
{
public static void main(String[] args)
{
final Boo boo = new Boo();
}
}
催奇形また、(それはリフレクションを使用しているだろうか)動作するはずン:
import static java.lang.System.out;
import java.lang.reflect.Method;
public class Foo
{
private boolean light;
public Foo()
{
turnOn();
}
public void turnOn()
{
this.light = true;
}
public void turnOff()
{
this.light = false;
}
public boolean isGreenLight()
{
return this.light;
}
}
public class Boo
{
public Boo()
{
if ((boolean) Class.forName("Foo").getMethod("isGreenLight", null).invoke(new Foo(), null))
{
out.println("Ok!");
}
}
}
public final class Main
{
public static void main(String[] args)
{
final Boo boo = new Boo();
}
}
の予想される出力(未テスト):
OK!
呼び出しを行う方法(直接対反射)の問題ではなく、メソッド*自体を非静的に変更することについての質問です。ダイレクトコールをリフレクションコールに変更するだけで、そのメソッドを静的メソッドとして残しておけば、コードは*悪化しました!! * – Andreas
「そのメソッドから値を取得する」とはどういう意味ですか? ?返される値を取得しますか?たぶんあなたはいくつかのコードサンプルを与えるべきです。 –
@Andreasはい、私は非静的にメソッドを変更し、Reflectionによってそれにアクセスするという事態について話しています。 –