Недавно я перестраивал Java-код шахт, пытаясь устранить, где это возможно, static
материал (переменные и методы) и заменить его лучшими методами кодирования.Reflection VS static 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();
}
}
Hypothetic situa ции, которые также должны работать (как бы с помощью отражения):
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 –