小编0xb*_*7ed的帖子

Java是否也对处理空值的相等性进行了通用测试?

Java标准库中是否存在具有静态相等函数的任何地方?

public static <T> boolean equals(T a, T b)
{
    if (a == null)
        return b == null;
    else if (b == null)
        return false;
    else
        return a.equals(b);
}
Run Code Online (Sandbox Code Playgroud)

我刚刚在一个新的项目Util类中实现了这个,无数次.似乎令人难以置信的是它不会作为标准库函数发布......

java

6
推荐指数
2
解决办法
134
查看次数

javac可以提供类的“源调试扩展信息”属性吗?

Java类文件格式支持称为“源调试扩展名”的属性(请参见Java语言规范§4.7.11“ SourceDebugExtension属性”)。

在支持JVMTI这方面的JVM中,您可以使用来查询此字符串jvmtiError GetSourceDebugExtension(jvmtiEnv *, jclass, char **)

我的问题是,是否存在一种使用普通javac语言和Java语言将“源调试扩展”信息嵌入.class文件的方法。核心Java语言中似乎没有可以执行此操作的注释(的javadocjava.lang.Annotation的“所有已知的实现类”列表中没有明显的候选)。

java annotations jvmti

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

铃声一遍又一遍地播放(无限循环播放)

我有一个Android应用程序,RingtoneManager.TYPE_NOTIFICATION当某些事件发送到BroadcastReceiver时播放通知铃声().

播放铃声的代码基本上是这样的:

    onReceive(Context context, Intent intent)
    {
        ...
        Uri ringtoneUri = someFunctionToLookupAValidNotificationRingtoneUri();
        ...
        Ringtone tone = RingtoneManager.getRingtone(context, uri);
        Log.v(TAG, "About to play ringtone");
        tone.play();
    }
Run Code Online (Sandbox Code Playgroud)

每当这段代码运行时,铃声就会无限地开始一遍又一遍地播放.有时它会在大量事件紧密聚集在一起时发生,但是当只有一个事件进入时它也会发生.日志消息(和调试)验证tone.play()每个事件只发生一次呼叫,并且没有无限的事件流.

阻止无限循环的唯一方法是杀死我的应用程序.

这几乎就像每隔一段时间一样,Android会忘记刷新声音输出缓冲区,因此它会通过播放内部的任何内容来保持循环.

有任何想法如何调试和/或解决这个问题?

android ringtone android-mediaplayer

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

为什么在 Windows 上调用 MinGW 编译的函数(不加载库)时会出现 UnsatisfiedLinkError?

我正在 Windows 上使用 Eclipse 制作一个简单的 JNI 测试应用程序。我的 C++ 编译器是 MinGW 4.6.2。UnsatisfiedLinkError当我尝试在我的测试 DLL 中调用一个函数时,Java 抛出了一个 DLL(DLL 本身加载没有问题)。我已经验证我的 DLL 导出了一个与javah实用程序生成的函数同名的“C”函数。

尝试调用该函数怎么可能会产生链接错误?(另外,有没有办法获得更多关于没有找到什么符号的详细信息?有一个几乎UnsatisfiedLinkError没用的秃头声明。)

这是定义本机函数的Java:

package com.xyz.jsdi_test;

import java.io.File;

public class JSDI
{
    public static native void func(
        String str,
        int i,
        Integer ii,
        long j /* 64 bits */,
        Long jj,
        byte[] b
    );
    public static void dummy()
    {
        System.out.println("JSDI.dummy()");
    }
    static
    {
        File f = new File("..\\jsdi\\bin\\jsdi.dll");
        System.out.println("Preparing to load: " + f);
        System.load(f.getAbsolutePath()); …
Run Code Online (Sandbox Code Playgroud)

c java windows dll java-native-interface

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

插入到流的右值引用中是否合理有效?

我做了一个自定义流类型,调用它error_stream,它源自std::ostringstream.我还为流调用了一个自定义操纵器throw_cpp_class(throw_cpp是一个实例throw_cpp_class).我的目标是使用这种语法:

error_stream s;
s << "some error " << message() << throw_cpp; // throw_cpp throws an exception containing contents of the stream.
Run Code Online (Sandbox Code Playgroud)

我发现通过定义一个插入运算符,它将流的右值引用作为第一个操作数,我现在可以这样做:

error_stream() << "some error " << message() << throw_cpp;
Run Code Online (Sandbox Code Playgroud)

插入运算符如下所示:

error_stream& operator<<(error_stream&& s, const throw_cpp_class&)
{
    throw s.str();
    return s;
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么我可以返回类型的值error_stream&&,其中一个error_stream&是必需的?(这会调用移动构造函数吗?).这非常低效吗?(不是我真的在乎,因为异常应该是罕见的).

c++ c++11

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

在Java 9模块路径和类路径之间拆分Gradle依赖项:自动模块

我遵循了Gradle指南来构建Java 9模块,从而使一个简单的基于Java 9的库项目成为现实。特别是,我按照指南中的建议手动设置了模块路径,如下所示:

ext.moduleName = 'com.foo.bar' 

compileJava {
    inputs.property("moduleName", moduleName)
    doFirst {
        options.compilerArgs = [
            '--module-path', classpath.asPath,
        ]
        classpath = files()  
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这只是获取我的整个类路径(由Gradle从我的依赖图中确定),并将其移到模块路径中。

除了一个简单的问题以外,一切工作都很好。我的某些依赖项(例如 org.jetbrains.kotlin:kotlin-stdlib-1.2.10)不是真正的Java 9模块,因为它们缺少module-info.class。它的优良坚持他们的类路径上模块路径,因为,现在java将它们转换成所谓的自动模块

问题就出现了,因为即使是一个自动模块,如果是我的模块的道路上,我需要参考它在requires指令中我的项目的模块。但是由于我-Xlint:all选择了Java编译器,因此会javac产生以下警告:

/path/to/myproject/foo-module/src/main/java/module-info.java:26: warning: requires directive for an automatic module
    requires kotlin.stdlib;
                   ^
Run Code Online (Sandbox Code Playgroud)

这个警告对我来说是站不住脚的,因为我也随该-Werror javac标志滚动,因此它使我的构建失败。

因此,似乎我需要将自动模块推送到我的类路径上,并仅在模块路径上保留“ true”模块依赖项...

是否有任何通用或半通用的方式(未与依赖项名称耦合)在编译器类路径及其模块路径之间拆分我的依赖项?

classpath gradle java-platform-module-system java-9 module-path

5
推荐指数
0
解决办法
675
查看次数

在xmm和ml64中的通用寄存器之间移动四字?

在一个为Microsoft x64汇编器编写的简单程序中,我想在SSE寄存器(例如xmm0)和通用寄存器(例如rcx)之间移动64位值,如<MASM中的Intel语法>:

mov xmm0, rcx
...
mov rcx, xmm0
Run Code Online (Sandbox Code Playgroud)

这两行分别从生成以下错误消息ml64.exe

  • 错误A2152:协处理器寄存器不能为第一个操作数
  • 错误A2070:无效的指令操作数

但是,显然有可能在x64中完成此简单任务。例如,以下是一个可运行的x64程序,我可以使用GCC <AT&T语法使用GCC 4.8.2>汇编并运行该程序:

.text
    .globl main
main:
    movl $1, %ecx
    movq %rcx, %xmm0
    movq %xmm0, %rax
    ret
Run Code Online (Sandbox Code Playgroud)

不出所料,该程序的返回值为1,其objdump输出为main()

1004010d0:   b9 01 00 00 00          mov    $0x1,%ecx
1004010d5:   66 48 0f 6e c1          movq   %rcx,%xmm0
1004010da:   66 48 0f 7e c0          movq   %xmm0,%rax
1004010df:   c3                      retq
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,鉴于ml64.exe产生上述错误,我该如何在MASM中完成此操作?

64-bit assembly x86-64 masm gnu-assembler

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

为什么 Java 1.0.2 中的接口 Member 没有设置 ACC_ABSTRACT?

我编写了一个简单的 Java 字节码解析器来进行一些实验,最近它在一个意想不到的地方失败了。在读取java/lang/reflect/Member.javaJava 1.1.8.16时rt.jar,我的解析器很生气,因为Member它是这样开始的(注意缺少ACC_ABSTRACT标志):

\n\n
Classfile Member.class\n  Last modified Aug 8, 2002; size 350 bytes\n  MD5 checksum 9a1aaec8e70e9a2ff9d63331cb0ea34e\n  Compiled from "Member.java"\npublic interface java.lang.reflect.Member\n  minor version: 3\n  major version: 45\n  flags: (0x0201) ACC_PUBLIC, ACC_INTERFACE\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

Java 1.2.2.17 的版本更正了这一点,并将标志设置为0x0601( ACC_ABSTRACT | ACC_INTERFACE | ACC_PUBLIC)。

\n\n

我能找到的最早的 JVM 规范(据称是 1.0.2)有这样的说法(\xc2\xa74.1,p.\xc2\xa086,强调):

\n\n
\n

接口是隐式抽象的 (\xc2\xa72.13.1);必须设置ACC_ABSTRACT\xef\xac\x82ag 。接口不可能是最终的;如果是的话,它的实现永远无法完成(\xc2\xa72.13.1),因此它无法设置其\xef\xac\x82ag。ACC_FINAL

\n
\n\n

JVM 规范第 9 版也有类似的话

\n\n
\n

如果ACC_INTERFACE …

java jvm bytecode .class-file jvm-bytecode

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

我可以在 Glog 中设置全局日志记录级别吗?

在 Java(我通常使用的语言)中,日志库的一个共同特性是能够设置“全局”日志记录级别 -例如,如果级别为WARNING或更高,则发送到日志文件,否则不会,无论完成日志记录的模块。

我想要做的考勤记录是相同的,与结合也只记录到标准错误,而不是文件。

如何?

更新:当控制传递给我的代码时,可执行文件已经启动 - 我正在作为 AWS Lambda 函数运行 - 所以我不确定我是否可以选择在命令行上设置 Glog 状态。我可以用函数调用来做吗?


我都是 GoLang 的新手,我想我只是不了解 Go 的内部逻辑。因为我的思想无法穿透Glog 文档。所以这个问题可能看起来很幼稚。

go amazon-web-services glog aws-lambda

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

使用编译时已知的常量array1初始化C++ array2

我有以下数组:

int const A[4] = { 0, 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

我想初始化一个重复的数组,如下所示:

int a[4] = A;
Run Code Online (Sandbox Code Playgroud)

如果我在cygwin上运行g ++ 4.8.2如下:

g++ --std=c++11 myfile.cpp
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

myfile.cpp:16:16: error: array must be initialized with a brace-enclosed initializer
    int a[4] = A;
               ^
Run Code Online (Sandbox Code Playgroud)

然而,显然" int a[4] = { A };"也不会起作用.有没有一种方法来初始化我的数组aA使用简单的赋值语句,而不诉诸:

int a[4] = { A[0], A[1], A[2], A[3] };
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors constants constant-expression c++11

3
推荐指数
2
解决办法
475
查看次数