基本上我有一个系统,它使用Javascript通过Rhino或Nashorn运行许多"插件"脚本,具体取决于用户安装的JRE.
我还在Java环境中有一个系统,允许在运行时插入额外的.JAR文件.
这一切都很好,花花公子.不过我现在已经碰到过,我想要的东西稍有不同的情况:我想一个.jar文件从加载到类路径中的犀牛/犀牛引擎实例,所以类可用于该实例(该实例只),然后在发动机完成运行时将其移除.
我知道我可以轻松地调用我现有的Java例程来使用JavaScript加载.JAR文件的URL,但是这些类是永久安装的,我无法摆脱它们.
问题基本上源于这样一个事实:用户可能有多个插件具有相同.JAR文件的不同版本(它由第三方提供,并以不同方式用于多个不同的插件),我需要插件才能够加载正确的一个,然后再抛弃它.
我现有的URL加载器是:
public static void addURL(URL u) {
final Class[] parameters = new Class[]{URL.class};
URLClassLoader sysloader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class sysclass = URLClassLoader.class;
try {
Method method = sysclass.getDeclaredMethod("addURL", parameters);
method.setAccessible(true);
method.invoke(sysloader, new Object[]{u});
} catch (Exception ex) {
ex.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我实际上并不知道它是如何工作的 - 我不是一个强大的Java程序员(我主要做C/C++).我知道你不能从URLClassLoader"卸载"一个URL,所以我不是这么想的.我想,最好的办法是,如果有一种方法可以将.JAR文件添加到"临时"URLClassLoader中,然后我会在执行结束时抛弃它.或者某种方式我可以直接将类加载到脚本引擎而不是主Java ClassPath.
如果这是我可以直接从JavaScript调用的东西,那将是很好的,但我不介意实现一些Java方法来完成工作,如果需要,甚至以某种方式扩展脚本引擎.
我正在尝试(但失败)弄清楚如何在Java中运行完全交互式的shell程序。
这是场景:
我有一个跨平台并用Java编写的大型GUI应用程序。为此,我试图添加一个交互式的命令行环境以无头运行。这方面的一切都很好,花花公子。但是,主GUI的功能之一是编辑文件。现在,对于命令行界面,我希望能够执行外部编辑器来编辑文件,然后返回保存和退出后的状态。例如,在Linux上,它可以执行“ vi / path / to / file”。
那么,如何以键盘和显示器与应用程序完全交互的方式执行该命令?我不希望它在后台运行。我不希望它通过Java重定向IO,我只希望一个命令“在前台”运行直到存在。
就像我system()在C中使用该函数一样。
到目前为止,我发现的所有内容都在后台运行命令或通过Java通过IO传递IO,这不适用于交互式(非行模式)应用程序。
哦,还有最后一个警告:我仅限于Java 1.6兼容性,所以我不能用做花哨的事情ProcessBuilder。
这是强制性的SSCCE:
class exetest {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("vi");
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望Runtime.getRuntime()。exec()一直阻塞到我完成操作为止vi,在此期间,所有键盘输入都将直接进入(RAW众所周知),vi并且所有屏幕输出都将直接返回,而不会受到影响。用户。
这就是我要在C中实现的方式:
void main() {
system("vi");
}
Run Code Online (Sandbox Code Playgroud)
更新:
这样可以达到预期的结果,但是a)仅限于Linux / OSX(不是很多问题,但是可以跨平台使用会很好),b)是一个可怕的难题:
import java.io.*;
class exetest {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec("/bin/bash");
OutputStream …Run Code Online (Sandbox Code Playgroud) 我试图找到一种方法来同步两个共享数据的进程.
基本上我有两个使用共享内存链接的进程.我需要进程A在共享内存区域中设置一些数据,然后进程B读取该数据并对其进行操作.
我期待的事件顺序是:
换句话说,B将阻塞直到它得到"1"信号,得到数据,然后再次阻塞,直到该信号变为"0".
我已经设法使用纯共享内存来模拟它,但是我使用while循环消耗100%的CPU时间,或者我使用带有nanosleep的while循环,有时会错过某些信号.
我已经尝试过使用信号量,但我只能找到一种方法来等待零,而不是一个,并尝试使用两个信号量只是没有用.我不认为信号量是要走的路.
将有许多进程都访问相同的共享内存区域,并且在修改共享内存时需要通知所有进程.
它基本上试图模拟硬件数据和控制总线,其中事件是边缘而不是电平触发.这是我感兴趣的国家之间的转变,而不是国家本身.
那么,任何想法或想法?
我有一个构造函数订购问题,我正在尝试提出创造性的解决方法.
基本上我有一个简单的类Color,它存储RGB颜色信息,并允许操纵所述颜色和转换到其他颜色空间(24位,16位,4位,HSV,XYZ,LAB等).班级本身工作得很好.
我还有一个预定义颜色库,例如:
namespace Colors {
const Color Snow (255,250,250);
const Color GhostWhite (248,248,255);
const Color WhiteSmoke (245,245,245);
const Color Gainsboro (220,220,220);
const Color FloralWhite (255,250,240);
const Color OldLace (253,245,230);
const Color Linen (250,240,230);
const Color AntiqueWhite (250,235,215);
const Color PapayaWhip (255,239,213);
const Color BlanchedAlmond (255,235,205);
};
Run Code Online (Sandbox Code Playgroud)
在正常使用程序时,它们都可以正常工作.
当我尝试将构造函数中的库颜色用于另一个对象时,我的问题出现了.没有什么可说的,我使用的库颜色的构造函数已被执行,并且在接收到的另一个类的构造函数之前分配了颜色数据(它进行了一些小的预处理以计算一些不同的颜色空间值)Color对象并将其分配给自身内部的存储变量.
例如,Color类有一个构造函数:
Color(const Color &c) {
setColor(c.getRed(), c.getGreen(), c.getBlue());
}
Run Code Online (Sandbox Code Playgroud)
还有一个=运营商:
Color &Color::operator=(const Color &rhs) {
setColor(rhs.getRed(), rhs.getGreen(), rhs.getBlue());
return *this;
}
Run Code Online (Sandbox Code Playgroud)
setColor() 只是一个小辅助函数,它存储值并预先计算一些颜色空间替代值.
当我在另一个对象的构造函数中包含一个时,请说:
Color …Run Code Online (Sandbox Code Playgroud) 有没有一种干净快速的方法来查找数组的最小值和最大值
int array1[] = {2,6,10,22,12};
结果是
最小值 = 2 / 最大值 = 22
// Function
void min_max(set<int> my_set)
{
for (auto i : my_set);
}
// Function to find the maximum element
int findMax(set<int> my_set)
{
// Get the maximum element
int max_element;
if (!my_set.empty())
max_element = *(my_set.rbegin());
// return the maximum element
return max_element;
}
// Function to find the minimum element
int findMin(set<int> my_set)
{
// Get the minimum element
int min_element;
if (!my_set.empty())
min_element = *my_set.begin();
// …Run Code Online (Sandbox Code Playgroud)