Kürzlich habe ich einen Java-Code von Minen Umstrukturierung versucht, wo immer möglich zu beseitigen static
stuff (Variablen und Methoden) und ersetzen Sie es mit besseren Programmierpraktiken.Reflection VS statische Zeug
Ich begann auch Reflexion und bemerkte zu studieren, dass es mir ein paar Dinge , die auf dem ersten zu tun erlaubt, ich nur (oder zumindest das ist, wie ich es sehe) erreichen könnte mit static
Anrufen oder Referenzen.
Allerdings, während ich gelesen habe, dass die Verwendung von static
nicht viel zu empfehlen ist, scheint es nicht das gleiche mit der Reflexion zu sein.
Also frage ich: statt eine Methode static
zu machen und es wie ClassName.methodName()
zu nennen, ist es eine legitime Verwendung der Reflexion, die es zu einer Instanzmethode macht und sie durch aufruft?
wie dynamisch eine Klasse Inhalt
Hier ist ein Beispielcode zugreifen:
Hypothetische Situation, die funktioniert (aber ich will nicht um die Methode machen 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();
}
}
Hypothetische Situation tion, der sollte auch funktionieren (wie es Reflexion verwendet werden würde):
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();
}
}
Erwartete Ausgabe (ungetestet):
Ok!
Es geht nicht darum, wie der Aufruf (direkte vs Reflexion) zu machen, sondern über die Änderung der Methode * selbst * als nicht statisch. Wenn Sie den direkten Aufruf einfach als Reflektionsaufruf ändern, die Methode aber als statische Methode belassen, haben Sie den Code * schlechter gemacht !! * – Andreas
Was genau meinen Sie mit "Wert von dieser Methode abrufen"? ? Holen Sie den Wert, den es zurückgibt? Vielleicht sollten Sie einige Codebeispiele geben. –
@Andreas Ja, ich spreche über die Möglichkeit, die Methode zu ändern, um nicht-statische zu sein, und darauf zugreifen von Reflection –