最近我已經重組了一個Java代碼,試圖儘可能地消除static
東西(變量和方法),並用更好的編碼實踐取而代之。反射VS靜態東西
我也開始學習思考,發現它可以讓我做一些事情說,起初,我只能實現(或者,至少,這就是我看到它)與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();
}
}
預期輸出(未經測試):
好!
這不是一個如何進行調用(直接與反射),而是關於將方法*本身*改爲非靜態的問題。如果您只是將直接調用更改爲反射調用,但將該方法保留爲靜態方法,那麼您只是讓代碼*變得更糟!! * – Andreas
您究竟意味着什麼「從該方法中檢索值」 ?獲取它返回的價值?也許你應該給一些代碼示例。 –
@Andreas是的,我正在談論將方法更改爲非靜態方法,並通過Reflection訪問它 –