Namen von Konstanten mit Strings vergleichen

Status
Nicht offen für weitere Antworten.

rapthor

Bekanntes Mitglied
Hallo,

irgendwie komme ich nicht darauf, wie ich einen Konstantennamen einer JAVA-Klasse zur Laufzeit mit einem String vergleichen kann. Im konkreten Fall geht es darum, für einen String (z.B. "MAY") den äquivalenten Integer herauszufinden. Und dies für die Calendar-Klasse.

Ich habe also einen String und wenn dieser mit einem Konstantennamen der Klasse Calendar übereinstimmt (int JANUARY, int DECEMBER, int JULY, ...), so soll mir die int-Repräsentation dieses Wortes zurückgegeben werden.

Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt ...
 
du willst imho um zu viele ecken gehen.
januar - dezember haben die werte 0-11; das kannst du einfacher 'per hand' zuweisen..
 
norman hat gesagt.:
du willst imho um zu viele ecken gehen.
januar - dezember haben die werte 0-11; das kannst du einfacher 'per hand' zuweisen..

An sich geht das auch, ja. Hätte ja sein können, dass es eine allgemeinere Methode dafür gibt. Denn es gibt ja eine Unmenge an Klassen, die Konstanten verwenden.

Danke trotzdem!
 
Oder du benutzt die reflection API:

Code:
String myFieldName = "MAY";
GregorianCalendar cal = new GregorianCalendar();
Field[] fields = cal.getClass().getFields();
for (int i=0; i<fields.length; i++)
{
	if (fields[i].getName().equalsIgnoreCase(myFieldName))
	{
		try
		{
			System.out.println(fields[i].getInt(fields[i]));
		}
		catch (IllegalAccessException ex)
		{
			ex.printStackTrace();
		}				
	}
}

Das Beispiel ist nen Quickhack und somit sicherlich nicht die schönste und beste Art.
Es zeigt aber, wie man sowas machen könnte.

lr
 
Code:
package org.javaforum.y06.may.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Calendar;

/**
* This class gets the value of a constants by reflection.
*/
public class ReflectionTest
{

   /**
    * @param args
    * @throws NoSuchFieldException
    * @throws SecurityException
    * @throws IllegalAccessException
    * @throws IllegalArgumentException
    */
   public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException,
         IllegalAccessException
   {
      Class clazz = Calendar.class;
      final String constantName = "JUNE";

      // get the field with specific name, of given class
      Field field = clazz.getDeclaredField(constantName);

      // check if field is declared "public final static int"
      int modifiers = field.getModifiers();
      if (Modifier.isFinal(modifiers) && Modifier.isFinal(modifiers) && Modifier.isPublic(modifiers)
            && field.getType() == int.class)
      {
         // field is a constant
         int value = field.getInt(clazz);
         System.out.println("Value of constant with name " + constantName + " is: " + value);
      }

   }
}
 
Ok, wenn ihm schon alle Arbeit abgenommen wird, dann aber bitte richtig 🙂

Code:
     Class clazz = Calendar.class;
      final String constantName = "JUNE";

      // get the field with specific name, of given class
      Field field = clazz.getDeclaredField(constantName);

      // check if field is declared "public final static int"
      int modifiers = field.getModifiers();
      if (Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers) && field.getType() == int.class)
      {
         // field is a constant
         int value = field.getInt(clazz);
         System.out.println("Value of constant with name " + constantName + " is: " + value);
      }

Man beachte das .isStatic

lr
 
Code:
if (Modifier.isFinal(modifiers) && Modifier.isFinal(modifiers) && Modifier.isPublic(modifiers) && field.getType() == int.class)

hmm, da seh ich grad, dass ich zweimal auf isFinal überprüfe.

sicher ist sicher, aber das ist dann doch zuviel... hast recht LR, danke für das "korrektur lesen"... 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben