小编Jav*_*het的帖子

Java Class.isAssignableFrom始终返回false ...仅在IDE外部

我在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)

java unix linux class classloader

6
推荐指数
1
解决办法
752
查看次数

如何在Java中显式调用静态初始化器?

因此,作为示例,我有以下 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>();

java initialization

6
推荐指数
1
解决办法
3646
查看次数

以另一个用户身份加载流程?

所以,我有一个根进程(以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)

c java unix linux

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

是什么让哈希图更快?

所以我知道哈希图使用存储桶和哈希码等等。根据我的经验,Java 哈希码通常不是很小,而是很大的数字,所以我假设它没有在内部建立索引。除非哈希码质量很差,导致桶长度和桶数量大致相等,否则是什么使哈希图比名称->值对列表更快?

java hashmap

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

Linux C读取单字节?

我在 JNA 中工作来调用 C 函数,而且我非常习惯read()读取单个字节的 Java函数。有没有办法在 C 中做到这一点而不声明缓冲区?

c unix linux

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

括号中带有寄存器的十六进制数在汇编中意味着什么?

lea 0x1c(%ebp),%eax

所以,我模糊地理解 lea 指令的作用,并且我知道那些是寄存器,但是这个结构是什么:0x1c(%ebp)?我从 objdump 中得到了这段代码。

linux assembly disassembly

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

标签 统计

java ×4

linux ×4

unix ×3

c ×2

assembly ×1

class ×1

classloader ×1

disassembly ×1

hashmap ×1

initialization ×1