我在OpenJDK和Oracle JDK上测试了不同版本Java上的三台Windows机器和两台Linux VPS.它完美运行,然后突然之间,它只在我的IDE中工作,虽然我没有改变任何相关的代码,我无法想象是什么导致这一点.
系统中的普遍代码:
Class<?> cls = (session == null ? secjlcl : session.getJLCL()).loadClass(name);
Logger.log(JavaLoader.class.isAssignableFrom(cls) + " - " + cls + " - " + cls.getSuperclass().getName());
if (JavaLoader.class.isAssignableFrom(cls)) {
Run Code Online (Sandbox Code Playgroud)
我的ClassLoader:
public class JavaLoaderClassLoader extends URLClassLoader {
public JavaLoaderClassLoader(URL[] url, ClassLoader parent) {
super(url);
}
private HashMap<String, Class<?>> javaLoaders = new HashMap<String, Class<?>>();
public String addClass(byte[] data) throws LinkageError {
Class<?> cls = defineClass(null, data, 0, data.length);
javaLoaders.put(cls.getName(), cls);
return cls.getName();
}
public Class<?> loadClass(String name, boolean resolve) {
if …Run Code Online (Sandbox Code Playgroud) 因此,作为示例,我有以下 JNI 代码:
/** This literally does nothing. It's purpose is to call the static initializer early to detect if we have issues before loading. */
public static void nothing() {
}
static {
// should be loaded by CLib
if (CLib.hasGNUTLS() == 1) {
globalinit();
}
}
Run Code Online (Sandbox Code Playgroud)
我发现自己实际上创建了一个名为“nothing”的函数,以便在必要时尽早调用它,但我也希望如果它之前被引用或者我们不调用它,则调用它nothing()。现在,我可以做一些涉及检查布尔值的令人讨厌的逻辑,但随后你会进入线程安全,等等。我想你可以,但它并不漂亮。有没有办法显式调用GNUTLS.<clinit>();?
所以,我有一个根进程(以root身份运行),我希望它使用非root uid加载另一个进程.
此刻,我正在调用seteuid,setegid然后在创建进程后重置为root.我发现该进程仍然使用root的uid加载.我该怎么用呢?
Java代码(JNA):
public boolean loadVHost(String java, File sockfile) throws IOException {
if (CLib.INSTANCE.setegid(suid) != 0) {
log("setegid C call failed! @ " + id);
return false;
}
if (CLib.INSTANCE.seteuid(suid) != 0) {
log("seteuid C call failed! @ " + id);
return false;
}
if (CLib.INSTANCE.getegid() != suid || CLib.INSTANCE.geteuid() != suid) {
log("geteuid/egid C call returned unwanted value! @ " + id + " (returned " + CLib.INSTANCE.getuid() + ":" + CLib.INSTANCE.getgid() + ")"); …Run Code Online (Sandbox Code Playgroud) 所以我知道哈希图使用存储桶和哈希码等等。根据我的经验,Java 哈希码通常不是很小,而是很大的数字,所以我假设它没有在内部建立索引。除非哈希码质量很差,导致桶长度和桶数量大致相等,否则是什么使哈希图比名称->值对列表更快?
我在 JNA 中工作来调用 C 函数,而且我非常习惯read()读取单个字节的 Java函数。有没有办法在 C 中做到这一点而不声明缓冲区?
lea 0x1c(%ebp),%eax
所以,我模糊地理解 lea 指令的作用,并且我知道那些是寄存器,但是这个结构是什么:0x1c(%ebp)?我从 objdump 中得到了这段代码。