Compiler Problem mit static final

mcbass

Mitglied
Hallo,

ich hab da nen dummes Problem und weis nicht ob es einen ausweg gibt.

Ich habe ein Programm welches auf eine Library zurückgreift. In dieser Library gibt es eine static final Variable mit der Versionsnummer. Wenn ich dieser Variable nun nutze, ersetzt der Compiler fleissig.

In meinem Source steht :

Code:
System.out.println("Start System with version : " + ExternalClass.VERSION);

und der Compiler macht dann :

Code:
System.out.println("Start System with version : 1.0");

Wenn ich jetzt aber ne neue Library nutzen will, sehe ich die neue Versionsnummer nicht. Eine Idee wie ich das Problem beheben kann ?

Danke,

mcb
 
Du siehst die neue Versionsnummer nicht - was siehst du denn stattdessen? Immernoch die 1.0 ? Oder gar nichts?

Also es kann natürlich ein Classpath-Problem sein. Angefangen dabei, dass du die neue Library nicht mit drin hast oder beide und das in der falschen Reihenfolge (kann auch passieren). Könnte aber auch sein, dass die neue Library die Variable mit der Versionsnummer nicht mehr hat oder dass die nicht public ist oder einfach vergessen wurde hochzusetzen, so dass die auch bei 1.0 steht...
 
Also ich hab wohl vergesse zu erwähnen das die Library im classPath beim kompilieren dabei ist. Später kann diese aber geweselt werden.

Wenn ich "mein" Programm decompiliere, sehe ich das der Compiler die static final Variable durch dessen wert ersetzt hat.

Code:
System.out.println("Start System with version : 1.0");

Ich sehe also immer : Start System with version : 1.0"

auch wenn ich z.b Libraries mit der Version 2.0 hätte
 
Hallo,

wenn die static final Attribute als Object deklarierst werden sie nicht geinlined (IMHO werden nur static final primitive und Strings geinlined)

Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 *
 */
public class StaticFinalInlineExample {

  static final int A = 1;
  static final String B = "2";
  static final Object C= 1;
  static final Object D= "2";
  
  /**
   * @param args
   */
  public static void main(String[] args) {
    System.out.println(A); //inlined
    System.out.println(B); //inlined
    System.out.println(C); //not inlined
    System.out.println(D); //not inliend
  }

}

Dekompiliert mit jad:
Java:
// Decompiled by DJ v3.7.7.81 Copyright 2004 Atanas Neshkov  Date: 15.11.2007 13:03:30
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   StaticFinalInlineExample.java

package de.tutorials;

import java.io.PrintStream;

public class StaticFinalInlineExample
{

    public StaticFinalInlineExample()
    {
    }

    public static void main(String args[])
    {
        System.out.println(1);
        System.out.println("2");
        System.out.println(C);
        System.out.println(D);
    }

    static final int A = 1;
    static final String B = "2";
    static final Object C = Integer.valueOf(1);
    static final Object D = "2";

}


Gruß Tom
 
Winziges Problem,..... ich hab die Variable nicht unter Kontrolle. Die Library ist zugekauft und der Laden ist etwas,.. sagen wir mal träge bezüglich Änderungen.

Ich will nur ausschliessen das es nicht irgendetwas gibt was ich tun kann bevor ich die Welle schlage.
 
In etwa so geht das mit Reflection ;)

Java:
public class StaticReflectionExample {

	public static final int CONSTANT = 1;

	public static void main(String[] args) {
		try {
			Object obj = StaticReflectionExample.class.getDeclaredField("CONSTANT")
					.get(null);
			System.out.println(obj);
		}
		catch (Exception e) {
			e.printStackTrace( );
		}
	}
}
 
Zurück