2016-06-02 2 views
-1

je la structure suivante pour un grand projet Java:Java: Modification de la valeur de la variable statique par chaîne de nom de classe

Class BigParentClass 
{ 
... 
}; 

Et puis de nombreuses classes qui étendent ce BigParentClass, tous ont une même variable statique .

Class A extends BigParentClass 
{ 
    static boolean importantVal = false; 
}; 

Class B extends BigParentClass 
{ 
    static boolean importantVal = false; 
} 
..etc.. 

Ce que je dois faire est, lors de l'initialisation, je vais obtenir une liste des chaînes de nom de classe dans laquelle je dois régler la importantVal variable statique à TRUE. Je vais donc obtenir une liste telle que:

"A, C, F, K"

et je besoin d'une manière dont pour changer la variable statique pour les classes A, C, F, K à TRUE. Quel serait le moyen de le faire?

J'ai essayé de faire quelque chose comme:

Class strToClass = Class.forName(classNameString); 

Cependant, il n'y a pas moyen de référencer la variable statique « importantVal » sans jeter cette variable de classe à une classe réelle qui l'a. Dois-je couper juste mes pertes, et une instruction switch pour toutes mes classes qui fait le changement que je dois:

Class class = Class.forName(classNameString); 
switch(class) 
{ 
    case A: 
     (A)class.importantVal = true; 
     break; 
    case B: 
     (B)class.importantVal = true; 
     break; 
    ..etc.. 
} 
+3

Il semble que vous essayez de faire quelque chose de très étrange. Pourquoi voulez-vous changer la variable? Quelle est la grande image? – Kayaman

+0

Je dois rendre quelque chose différemment basé sur cette valeur, et cette valeur peut être changée par une source externe (j'obtiendrais un dossier avec les noms de classe qui exigent que ceci soit changé). La seule autre option consisterait à comparer la classe en cours avec cette liste lors du rendu réel, mais il s'agit potentiellement d'une grande liste et le rendu et le rendu sont assez fréquents. – Tesla

Répondre

1

Vous pouvez simplement utiliser la méthode getDeclaredField et set sur l'objet de classe elle-même, car il est un champ statique.

Class<?> clazz = Class.forName("MyClass"); 
clazz.getDeclaredField("importantVal").set(null, true); 

Ainsi, au sein de votre itération:

for (String fullyQualifiedClassName: myIterable) { 
    try { 
     Class 
      .forName(fullyQualifiedClassName) 
      .getDeclaredField("importantVal").set(null, true); 
    } 
    // java 7 idiom here to simplify 
    catch (ClassNotFoundException | NoSuchFieldException | 
      IllegalAccessException | IllegalArgumentException e) { 
     // TODO handle 
    } 
} 
+1

N'est-ce pas 'set (null, true)'? –

+0

@AndyTurner effectivement les deux idiomes semblent fonctionner. – Mena

+0

["Si le champ sous-jacent est statique, l'argument obj est ignoré, il peut être nul."] (Https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field. html # set (java.lang.Object,% 20java.lang.Object)) Donc, oui, soit travailler. Je préfère le null, car il semblerait que vous définissiez un champ sur l'instance 'Class' dans le cas contraire. –

0

Cela sent comme une mauvaise conception. Au lieu de définir les champs des autres classes, laissez chaque classe définir sa propre valeur en tirant dans la configuration initiale:

public class InitialConfig { 
    public static Collection<String> importantValueEnabledClassNames() { 
     // Read class name strings here 
    } 
} 

public class A extends BigParentClass { 
    static final boolean importantVal = 
     InitialConfig.importantValueEnabledClassNames().contains(
      A.class.getName()); 
} 

public class B extends BigParentClass { 
    static final boolean importantVal = 
     InitialConfig.importantValueEnabledClassNames().contains(
      B.class.getName()); 
}