小编Ste*_*ven的帖子

什么是堆栈映射框架

我最近一直在研究Java虚拟机规范(JVMS),试图更好地理解我的程序是如何工作的,但我找到了一个我不太了解的部分......

4.7.4节描述了StackMapTable属性,在该部分中,文档详细介绍了堆栈映射帧.问题在于它有点罗嗦,我通过榜样学得最好; 不是通过阅读.

我知道第一个堆栈映射帧是从方法描述符派生的,但我不明白如何(这应该在这里解释.)另外,我不完全理解堆栈映射帧的作用.我认为它们与Java中的块类似,但看起来好像你不能在彼此内部堆栈映射帧.

无论如何,我有两个具体问题:

  • 堆栈映射框架有什么作用?
  • 如何创建第一个堆栈映射框架?

还有一个普遍的问题:

  • 有人能提供的解释比JVMS中给出的解释更少,更容易理解吗?

java jvm bytecode stack-frame

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

如何更改PictureBox的图像?

我在C#中有一个程序,PictureBox里面有一个对象Form.我该如何改变它的图片?可供选择的图片在bin/Pics中; 它们是jpeg的格式,如果这很重要..

c# image picturebox winforms

15
推荐指数
1
解决办法
11万
查看次数

Rhino中的XMLHttpRequest?

最近我一直在使用Java的ScriptEngine API,即javascript引擎,它使用Rhino来处理所有事情.我总结了Rhino没有XMLHttpRequest的事实.我想知道是否有人知道可能的方法吗?

javascript java xmlhttprequest rhino

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

是否可以在 Rust 中获得整数的本机 CPU 大小?

为了好玩,我正在用 Rust 编写一个 bignum 库。我的目标(与大多数 bignum 库一样)是尽可能提高效率。我希望它即使在不寻常的架构上也能高效。

在我看来,CPU 将在具有架构的本机位数的整数上更快地执行算术运算(即,u64对于 64 位机器,u16对于 16 位机器等)因此,因为我想创建一个在所有架构上都有效的库,我需要考虑目标架构的本机整数大小。这样做的明显方法是使用cfg 属性 target_pointer_width。例如,定义最小的类型,它总是能够容纳超过最大原生 int 大小:

#[cfg(target_pointer_width = "16")]
type LargeInt = u32;

#[cfg(target_pointer_width = "32")]
type LargeInt = u64;

#[cfg(target_pointer_width = "64")]
type LargeInt = u128;
Run Code Online (Sandbox Code Playgroud)

但是,在调查此问题时,我遇到了此评论。它给出了一个架构示例,其中原生 int 大小与指针宽度不同。因此,我的解决方案不适用于所有架构。另一个潜在的解决方案是编写一个构建脚本,它编码一个LargeInt基于 a 的大小定义的小模块usize(我们可以像这样获取:)std::mem::size_of::<usize>()但是,这与上面有相同的问题,因为usize它基于指针宽度以及。最后一个明显的解决方案是简单地为每个架构保留一个本地 int 大小的映射。但是,此解决方案不够优雅且无法很好地扩展,因此我想避免使用它。

所以,我的问题是:有没有办法找到目标的本机 int 大小,最好在编译之前,以减少运行时开销?这种努力是否值得?也就是说,使用本机 int 大小与指针宽度之间是否可能存在显着差异?

optimization cpu-architecture bigint rust

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

使用javax.tools在运行时编译java源代码?

所以,java有一个内置的库,专门用于将java源代码编译成.class文件,它就在javax.tools.所以,我想知道你究竟是如何让它发挥作用的.我已经阅读了javadoc,并在那里给出了一些示例,但是当我使用这些示例时,我会遇到错误.

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
Run Code Online (Sandbox Code Playgroud)

这是oracle提供的示例,以便获取StandardJavaFileManager可以从中执行更多操作的类的实例.但是,我在该代码的第一行遇到了一些问题.当我尝试这样做时ToolProvider.getSystemJavaCompiler();,它总是返回null.在该方法的javadoc中,它表示"返回此平台提供的编译器,如果没有提供编译器,则返回null." 但他们从未表现出任何其他方式获得一个实例JavaCompiler.我已经尝试了许多其他方法,例如使用a ServiceLoader来找到我能够提供的任何参考,但不会占上风.我怎么能让这个工作?

java compilation

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

如何在编译之前修改 Gradle 项目中的 Java 源代码而不修改磁盘上的文件?

我有一个 Gradle 项目。在我的源代码中,我有一些使用相同字符串的注释(除其他外)。然而,这个相同的字符串存在于一个配置文件中,我只想引用那个文件,所以我只需要在一个地方更改这个字符串,以便更改它的所有实例。因此,我必须从文件中读取字符串,这意味着该字符串不是编译时常量。因此我不能使用从文件中读取的字符串作为注释参数。

// I have this.
@Annotation("some_string")
Object a;

@Annotation("some_string")
Object b;


// This doesn't work
String ss = // read a file, fetch the string from the file.

@Annotation(ss)
Object a;

@Annotation(ss)
Object b;
Run Code Online (Sandbox Code Playgroud)

我想知道 Gradle 中是否有一种方法可以在编译之前修改源代码,使我可以用一个变量控制所有注释参数。

即,在源代码中,我可以使用 Gradle 任务中的变量@Annotation("%%some_string%%")替换所有出现的%%some_string%%。用类似的东西简单地修改每个源文件是很容易的

def annotation_variable = // read a file, fetch the string from the file.
for ( f in srcFileTree ) {
    def text = file(f).text
    file(f).text = text.replaceAll("%%some_string%%", annotation_variable)
}
Run Code Online (Sandbox Code Playgroud)

但是,这将永久修改源文件。因此,我正在寻找一种方法来修改管道中的文件,而无需实际修改磁盘上的文件。有没有办法做到这一点?

java gradle build.gradle

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

执行外部.class 文件?

因此,我有一个.class文件及其绝对路径,我需要知道如何.class从 Java 内部执行该文件。Class如果我也能从中得到一样东西就好了。

我知道loadClass中的方法ClassLoader,但它需要文件的“二进制名称”。我不确定是否可以获得外部.class文件的二进制名称,但如果可以的话,那会很有用!但是,如果没有,是否有其他方法来执行或获取外部文件的实例.class

/*For those of us who work better with examples..
Let's say I have a .class file located at C:/Users/USER/Desktop. So..*/

String absolutePath = "C:/Users/USER/Desktop/FILE.class";

/*Now, having that, how would I get an instance of that class, or,
at least, execute it?*/
Run Code Online (Sandbox Code Playgroud)

java reflection external execute

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

用于节点编辑器评估的高效图形遍历

我有一个由用户创建的有向无环图,其中图的每个节点(顶点)代表对某些数据执行的操作。节点的输出取决于其输入(显然),并且该输入由其父节点提供。然后输出将传递给其子级。保证不存在循环,因此可以忽略。

该图的工作原理与Blender 中的着色器编辑器相同。每个节点对其输入执行一些操作,并且该操作的成本可能任意高。因此,我只想在严格要求时评估这些操作。

当通过用户输入或其他方式更新节点时,我需要重新评估每个节点,这取决于更新节点的输出。但是,鉴于我无法证明多次评估同一节点的合理性,我需要一种方法来确定更新节点的正确顺序。基本的广度优先遍历并不能解决问题。要了解原因,请考虑此图:

具有复杂依赖结构的非循环图

传统的广度优先遍历将导致D在 之前进行评估B,尽管D依赖于B

我尝试过反向进行广度优先遍历(即从O1O2节点开始,向上遍历图形),但我似乎遇到了同样的问题。反向广度优先遍历将访问Dbefore B,因此I2before A,导致I2被排序在 after A,尽管A取决于I2

我确信我在这里遗漏了一些相对简单的东西,而且我觉得反向遍历似乎是关键,但我似乎无法全神贯注并让所有部分都适合。我认为一个潜在的解决方案是按预期使用反向遍历,但不是避免多次访问每个节点,而是在每次出现时访问每个节点,确保它具有绝对正确的顺序。但是多次访问每个节点以及随之而来的指数扩展是一个非常没有吸引力的解决方案。

对于此类问题是否有众所周知的有效算法?

algorithm graph-theory graph-traversal directed-acyclic-graphs graph-algorithm

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

CipherInputStream 在读取数据时挂起

我正在尝试加密/解密一些文件,我将使用FileIn/OutputStream通过CipherIn/OutputStreams 进行管道传输的 s 来读取/写入这些文件。概念相当简单,我已经使用原始字节数组和Cipher.doFinal. 所以我知道我的加密参数(位大小、iv 大小等)是正确的。(或者至少是实用的?)

我能够通过一个CipherOutputStream很好地写入数据。但是,当我尝试通过 a 读回该数据时CipherInputStream,它无限期地挂起。

我发现的唯一相关问题仍未得到解答,并且可能与我的问题有根本不同,因为我的问题将始终在磁盘上提供所有可用数据,而不是相关问题对Sockets.

我尝试了多种解决方案,最明显的一个是更改缓冲区大小(data = new byte[4096];)。我尝试了许多值,包括明文的大小和加密数据的大小。这些值都不起作用。我发现的唯一解决方案是CipherInputStream完全避免使用 a ,而是依赖Cipher.doFinaland Cipher.update

我错过了什么吗?能够使用 a 就好了CipherInputStream,而不必使用 重新发明轮子Cipher.update

SSCCE:

private static final String AES_ALG = "aes_256/gcm/nopadding";
private static final int GCM_TAG_SIZE = 128;

private static void doEncryptionTest() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
        InvalidAlgorithmParameterException, FileNotFoundException, IOException
{
    File f = new File("encrypted_random_data.dat");
    // 12-byte …
Run Code Online (Sandbox Code Playgroud)

java io aes aes-gcm

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