2017-09-22 99 views
0

我對按位運算有很好的理解。我的問題是特定案例。在從Oracle教程採取下面的代碼,是有可能改變的表達:java反射字段按位運算

if ((foundMods & searchMods) == searchMods) 

到:

if (foundMods == searchMods) 

? ...因爲我們沒有提取任何標誌,我們只是在測試平等。對? ...或者我錯過了什麼?

import java.lang.reflect.Field; 
import java.lang.reflect.Modifier; 
import static java.lang.System.out; 

enum Spy { BLACK , WHITE } 

public class FieldModifierSpy { 
volatile int share; 
int instance; 
class Inner {} 

public static void main(String... args) { 
try { 
    Class<?> c = Class.forName(args[0]); 
    int searchMods = 0x0; 
    for (int i = 1; i < args.length; i++) { 
    searchMods |= modifierFromString(args[i]); 
    } 

    Field[] flds = c.getDeclaredFields(); 
    out.format("Fields in Class '%s' containing modifiers: %s%n", 
      c.getName(), 
      Modifier.toString(searchMods)); 
    boolean found = false; 
    for (Field f : flds) { 
    int foundMods = f.getModifiers(); 
    // Require all of the requested modifiers to be present 
    if ((foundMods & searchMods) == searchMods) { 
     out.format("%-8s [ synthetic=%-5b enum_constant=%-5b ]%n", 
       f.getName(), f.isSynthetic(), 
       f.isEnumConstant()); 
     found = true; 
    } 
    } 

    if (!found) { 
    out.format("No matching fields%n"); 
    } 

    // production code should handle this exception more gracefully 
} catch (ClassNotFoundException x) { 
    x.printStackTrace(); 
} 
} 

private static int modifierFromString(String s) { 
int m = 0x0; 
if ("public".equals(s))   m |= Modifier.PUBLIC; 
else if ("protected".equals(s)) m |= Modifier.PROTECTED; 
else if ("private".equals(s))  m |= Modifier.PRIVATE; 
else if ("static".equals(s))  m |= Modifier.STATIC; 
else if ("final".equals(s))  m |= Modifier.FINAL; 
else if ("transient".equals(s)) m |= Modifier.TRANSIENT; 
else if ("volatile".equals(s)) m |= Modifier.VOLATILE; 
return m; 
} 
} 
+1

這是可能的,但會改變行爲... –

回答

1

此:

if ((foundMods & searchMods) == searchMods) 

說: 「如果foundMods包括searchMods所有位」。

此:

if (foundMods == searchMods) 

將是 「如果foundMods具有完全相同位作爲searchMods(沒有人)」。

如果你知道知道foundMods不會有任何其他位,那麼它們是等價的。否則,他們肯定是不同的。

+0

謝謝。好的簡潔的答案。繼續幫助初學者。 – user8656194

0

讓foundMods成爲Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL 現在讓searchMods成爲Modifier.PUBLIC。 foundMods & searchMods) == searchMods將評估爲true,而 foundMods == searchMods將爲false。 所以,是的,你錯過了某些東西,不,你不能用後一個表達式替換第一個。

1

簡短的回答沒有

更多的答案 你的假設,即 是if ((foundMods & searchMods) == searchMods)相當於 if (foundMods == searchMods)無效。

第一個if測試以確定searchMods值中的所有一個值位是否也是foundMods值中的一個值位。

因此,如果 和searchMods == 0000111然後foundMods == 0011111 if ((foundMods & searchMods) == searchMods)是真實的,但if (foundMods == searchMods)是假的。

對於字段修飾符, searchMods可能是當前(foundMods)字段中存在的修飾符的子集。

0

我們沒有提取任何標誌,我們只是測試平等。對?

編號searchMods是您要搜索的所有「點亮」標誌的集合。使用這樣的&運算符將檢查foundMods是否具有searchMods所具有的所有「點亮」標誌 - 但它會忽略foundMods可能具有的其他標誌,而==運算符則不會。

請看下面的例子:

int searchMods = Modifier.PUBLIC | Modifier.STATIC; 
int foundMods = Modifier.PUBLIC | Modifier.STATIC | Modifier.SYNCHRONIZED; 

System.out.println((foundMods & searchMods) == searchMods); 
System.out.println(foundMods == searchMods); 

第一個print語句將打印true,而第二個將打印false