Làm cách nào để tải một Lớp Java chưa được biên dịch?
Bạn cần phải biên dịch nó trước. Điều này có thể được thực hiện theo chương trình với javax.tools
API. Điều này chỉ yêu cầu JDK đang được cài đặt tại máy cục bộ trên đầu trang của JRE.
Dưới đây là một ví dụ Kickoff cơ bản (rời khỏi ngoại lệ rõ ràng xử lý sang một bên):
// Prepare source somehow.
String source = "package test; public class Test { static { System.out.println(\"hello\"); } public Test() { System.out.println(\"world\"); } }";
// Save source in .java file.
File root = new File("/java"); // On Windows running on C:\, this is C:\java.
File sourceFile = new File(root, "test/Test.java");
sourceFile.getParentFile().mkdirs();
Files.write(sourceFile.toPath(), source.getBytes(StandardCharsets.UTF_8));
// Compile source file.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
// Load and instantiate compiled class.
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName("test.Test", true, classLoader); // Should print "hello".
Object instance = cls.newInstance(); // Should print "world".
System.out.println(instance); // Should print "[email protected]".
nào mang lại như
hello
world
[email protected]
sử dụng tiếp theo sẽ dễ dàng hơn nếu những lớp implements
một giao diện nào đó mà đã trong classpath.
SomeInterface instance = (SomeInterface) cls.newInstance();
Nếu không, bạn cần liên quan đến Reflection API để truy cập và gọi các trường/phương thức (không xác định).
Điều đó nói rằng và không liên quan đến các vấn đề thực tế:
properties.load(new FileInputStream(new File("ClassName.properties")));
Cho java.io.File
dựa vào thư mục làm việc hiện nay là công thức cho tính di động gặp khó khăn. Đừng làm thế. Đặt tệp đó trong classpath và sử dụng ClassLoader#getResourceAsStream()
với đường dẫn tương đối classpath.
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("ClassName.properties"));
Chỉ cần một câu hỏi về chủ đề tắt. Tôi nhận được một null khi tôi tải các thuộc tính theo cách của bạn nhưng tôi nhận được các thuộc tính khi tôi làm điều đó Foo.class.getResourceAsStream()? Bạn có thể giúp tôi hiểu mã của bạn không? Cảm ơn bạn. – unj2
Tệp thuộc tính đó dường như được đặt trong cùng một gói với lớp 'Foo'. Như đã nói, bạn cần chỉ định đường dẫn tương đối classpath, ví dụ: 'com/example/filename.properties'. Nhưng nếu bạn có thể đảm bảo rằng tệp thuộc tính luôn nằm trong cùng một gói với lớp 'Foo', thì' Class # getResourceAsStream() 'cũng được. Bạn sẽ chỉ bỏ lỡ khả năng để externalize các propertiesfile bên ngoài ứng dụng để nó có thể được sửa đổi mà không cần sửa đổi/đóng gói lại ứng dụng. – BalusC
'Files.write (nguồn, sourceFile, StandardCharsets.UTF_8);' không biên dịch cho tôi. Tôi nghĩ bạn muốn 'Files.write (sourceFile.toPath(), source.getBytes());'. –