Zum Inhalt

Monat: August 2012

Spaß mit Konstanten

Interessant finde ich die Erkenntnis, dass Konstanten, die aus einer anderen Klasse verwendet werden, nicht automatisch aktualisiert werden, wenn die andere Klasse neu kompiliert wird. Um dieses Verhalten zu verdeutlichen ein einfaches Beispiel bestehend aus zwei Klassen.

public class InternalLibrary{
    public final static String A_MESSAGE = "This is a test"; // 1
    // public final static String A_MESSAGE = "Changed message"; // 2   
}
public class ExternalProgram{
    public static void main(String[] args){
        System.out.println(InternalLibrary.A_MESSAGE);
    }
}

Kompiliert und führt man das Programm nun aus, so erhält man die folgenden Ausgaben:

X:\funwithconstants>javac InternalLibrary.java
X:\funwithconstants>javac ExternalProgram.java
X:\funwithconstants>java ExternalProgram
This is a test

Ändert man nun »InternalLibrary« so, dass »1« aus- und »2« einkommentiert ist und kompiliert im Anschluss nur die geänderte Klasse neu, so ist man doch überrascht, dass die Ausgabe anders als vielleicht erwartet aussieht.

X:\funwithconstants>javac InternalLibrary.java
X:\funwithconstants>java ExternalProgram
This is a test

Die Ursache hierfür ist, dass der Compiler, sobald er Konstanten entdeckt, diese während der Kompilierung durch die konkreten Werte ersetzt. Somit muss man bei der Verwendung von Konstanten die Klassen neu kompilieren, die auf diese Klassen zugreifen. Konkret:

X:\funwithconstants>javac ExternalProgram.java
X:\funwithconstants>java ExternalProgram
Changed message

PowerShell: Windows Aufgabenplanung exportieren

Verwendet man die Windows Aufgabenplanung für viele Aufgaben, so macht es in jedem Fall Sinn die einzelnen Aufgaben auch zu sichern, damit man diese im Bedarfsfall auch einfach wieder importieren kann. Das folgende PowerShell Skript exportiert die Aufgaben.

$sch = New-Object -ComObject("Schedule.Service")
$sch.Connect("localhost")
$tasks = $sch.GetFolder("\").GetTasks(0)
 
$outfile_temp = "C:\PoSh\Save_ScheduledTasks\{0}.xml";
 
$tasks | %{
    $xml = $_.Xml
    $task_name = $_.Name
    $outfile = $outfile_temp -f $task_name
    $xml | Out-File $outfile 
}

Das Skript exportiert alle Aufgaben des lokalen Rechner (»localhost«) aus dem Hauptordner der Aufgabenplanung in das Verzeichnis, das mittels der Variablen »$outfile_temp« definiert wird.