Можно использовать MultiBinding + StringFormat (требует WPF 3.5 SP1):
Относительно Выполнения. Текст - Вы не можете связать с ним, но существуют некоторые обходные решения:
import java.io.*;
public class ClassVersionChecker {
public static void main(String[] args) throws IOException {
for (int i = 0; i < args.length; i++)
checkClassVersion(args[i]);
}
private static void checkClassVersion(String filename)
throws IOException
{
DataInputStream in = new DataInputStream
(new FileInputStream(filename));
int magic = in.readInt();
if(magic != 0xcafebabe) {
System.out.println(filename + " is not a valid class!");;
}
int minor = in.readUnsignedShort();
int major = in.readUnsignedShort();
System.out.println(filename + ": " + major + " . " + minor);
in.close();
}
}
Возможные значения:
major minor Java platform version
45 3 1.0
45 3 1.1
46 0 1.2
47 0 1.3
48 0 1.4
49 0 5
50 0 6
51 0 7
52 0 8
53 0 9
54 0 10
55 0 11
Apache BCEL предоставляет этот API:
JavaClass c = Repository.lookupClass("com.x.MyClass")
c.getMinor();
c.getMajor();
Как показали другие, это достаточно легко сделать, прочитав первые восемь байтов файла класса. Если вам нужна предварительно созданная двоичная библиотека, вы можете загрузить ее здесь .
Это дает вам содержимое файла класса:
MysteryClass.class.getResourceAsStream ("MysteryClass. class ")
Затем посмотрите байты 5-8, чтобы получить младшую и основную версии. Соответствие между этими числами и выпусками JDK можно найти здесь .
Просто прочтите файл класса напрямую. С версией ОЧЕНЬ легко разобраться. Ознакомьтесь со спецификацией и вики , а затем попробуйте код. Обернуть этот код и сделать его более полезным / красивым остается в качестве упражнения. В качестве альтернативы вы можете использовать такую библиотеку, как BCEL , ASM или JavaAssist
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ClassVersionTest
{
private static final int JAVA_CLASS_MAGIC = 0xCAFEBABE;
public static void main(String[] args)
{
try
{
DataInputStream dis = new DataInputStream(new FileInputStream("Test.class"));
int magic = dis.readInt();
if(magic == JAVA_CLASS_MAGIC)
{
int minorVersion = dis.readUnsignedShort();
int majorVersion = dis.readUnsignedShort();
/**
* majorVersion is ...
* J2SE 6.0 = 50 (0x32 hex),
* J2SE 5.0 = 49 (0x31 hex),
* JDK 1.4 = 48 (0x30 hex),
* JDK 1.3 = 47 (0x2F hex),
* JDK 1.2 = 46 (0x2E hex),
* JDK 1.1 = 45 (0x2D hex).
*/
System.out.println("ClassVersionTest.main() " + majorVersion + "." + minorVersion);
}
else
{
// not a class file
}
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Если вы можете реорганизовать свой код, вы можете заключить свои вызовы в методы final / static в простые методы экземпляра, например:
protected Foo doBar(String name) {
return Utility.doBar(name);
}
Это позволяет вам переопределить метод оболочки в модуле test, чтобы вернуть фиктивный экземпляр Foo.
В качестве альтернативы вы можете использовать Powermock , который расширяет Easymock (и Mockito), позволяя имитировать final и статические методы:
PowerMock - это среда, расширяющая другие макетные библиотеки, такие как EasyMock, с более мощными возможностями. PowerMock использует настраиваемый загрузчик классов и манипулирование байт-кодом, чтобы включить имитацию статических методов, конструкторов, конечных классов и методов, частных методов,