小编Maj*_*nko的帖子

从JavaScript内部添加和删除Jar文件和类(Rhino/Nashorn)

基本上我有一个系统,它使用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方法来完成工作,如果需要,甚至以某种方式扩展脚本引擎.

javascript java jar classpath

9
推荐指数
1
解决办法
590
查看次数

在Java中运行交互式Shell程序

我正在尝试(但失败)弄清楚如何在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)

java exec

8
推荐指数
2
解决办法
4394
查看次数

使用两种不同的状态同步两个进程

我试图找到一种方法来同步两个共享数据的进程.

基本上我有两个使用共享内存链接的进程.我需要进程A在共享内存区域中设置一些数据,然后进程B读取该数据并对其进行操作.

我期待的事件顺序是:

  1. B块等待数据可用信号
  2. A写入数据
  3. 可用的信号数据
  4. B读取数据
  5. B块等待数据不可用信号
  6. 信号数据不可用
  7. 一切都回到了开始.

换句话说,B将阻塞直到它得到"1"信号,得到数据,然后再次阻塞,直到该信号变为"0".

我已经设法使用纯共享内存来模拟它,但是我使用while循环消耗100%的CPU时间,或者我使用带有nanosleep的while循环,有时会错过某些信号.

我已经尝试过使用信号量,但我只能找到一种方法来等待零,而不是一个,并尝试使用两个信号量只是没有用.我不认为信号量是要走的路.

将有许多进程都访问相同的共享内存区域,并且在修改共享内存时需要通知所有进程.

它基本上试图模拟硬件数据和控制总线,其中事件是边缘而不是电平触发.这是我感兴趣的国家之间的转变,而不是国家本身.

那么,任何想法或想法?

c linux shared-memory

5
推荐指数
1
解决办法
1379
查看次数

构造函数排序(全局范围)问题

我有一个构造函数订购问题,我正在尝试提出创造性的解决方法.

基本上我有一个简单的类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)

c++ constructor global

5
推荐指数
1
解决办法
132
查看次数

有没有一种干净快速的方法来查找数组的最小值和最大值

有没有一种干净快速的方法来查找数组的最小值和最大值

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)

c++ arrays

-4
推荐指数
1
解决办法
1559
查看次数

标签 统计

c++ ×2

java ×2

arrays ×1

c ×1

classpath ×1

constructor ×1

exec ×1

global ×1

jar ×1

javascript ×1

linux ×1

shared-memory ×1