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);
}
我刚刚在一个新的项目Util类中实现了这个,无数次.似乎令人难以置信的是它不会作为标准库函数发布......
Java类文件格式支持称为“源调试扩展名”的属性(请参见Java语言规范§4.7.11“ SourceDebugExtension属性”)。
在支持JVMTI这方面的JVM中,您可以使用来查询此字符串jvmtiError GetSourceDebugExtension(jvmtiEnv *, jclass, char **)。
我的问题是,是否存在一种使用普通javac语言和Java语言将“源调试扩展”信息嵌入.class文件的方法。核心Java语言中似乎没有可以执行此操作的注释(的javadocjava.lang.Annotation的“所有已知的实现类”列表中没有明显的候选者)。
我有一个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();
    }
每当这段代码运行时,铃声就会无限地开始一遍又一遍地播放.有时它会在大量事件紧密聚集在一起时发生,但是当只有一个事件进入时它也会发生.日志消息(和调试)验证tone.play()每个事件只发生一次呼叫,并且没有无限的事件流.
阻止无限循环的唯一方法是杀死我的应用程序.
这几乎就像每隔一段时间一样,Android会忘记刷新声音输出缓冲区,因此它会通过播放内部的任何内容来保持循环.
有任何想法如何调试和/或解决这个问题?
我正在 Windows 上使用 Eclipse 制作一个简单的 JNI 测试应用程序。我的 C++ 编译器是 MinGW 4.6.2。UnsatisfiedLinkError当我尝试在我的测试 DLL 中调用一个函数时,Java 抛出了一个 DLL(DLL 本身加载没有问题)。我已经验证我的 DLL 导出了一个与javah实用程序生成的函数同名的“C”函数。
尝试调用该函数怎么可能会产生链接错误?(另外,有没有办法获得更多关于没有找到什么符号的详细信息?有一个几乎UnsatisfiedLinkError没用的秃头声明。)
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()); …我做了一个自定义流类型,调用它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.
我发现通过定义一个插入运算符,它将流的右值引用作为第一个操作数,我现在可以这样做:
error_stream() << "some error " << message() << throw_cpp;
插入运算符如下所示:
error_stream& operator<<(error_stream&& s, const throw_cpp_class&)
{
    throw s.str();
    return s;
}
这里发生了什么?为什么我可以返回类型的值error_stream&&,其中一个error_stream&是必需的?(这会调用移动构造函数吗?).这非常低效吗?(不是我真的在乎,因为异常应该是罕见的).
我遵循了Gradle指南来构建Java 9模块,从而使一个简单的基于Java 9的库项目成为现实。特别是,我按照指南中的建议手动设置了模块路径,如下所示:
ext.moduleName = 'com.foo.bar' 
compileJava {
    inputs.property("moduleName", moduleName)
    doFirst {
        options.compilerArgs = [
            '--module-path', classpath.asPath,
        ]
        classpath = files()  
    }
}
请注意,这只是获取我的整个类路径(由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;
                   ^
这个警告对我来说是站不住脚的,因为我也随该-Werror javac标志滚动,因此它使我的构建失败。
因此,似乎我需要将自动模块推送到我的类路径上,并仅在模块路径上保留“ true”模块依赖项...
是否有任何通用或半通用的方式(即未与依赖项名称耦合)在编译器类路径及其模块路径之间拆分我的依赖项?
classpath gradle java-platform-module-system java-9 module-path
在一个为Microsoft x64汇编器编写的简单程序中,我想在SSE寄存器(例如xmm0)和通用寄存器(例如rcx)之间移动64位值,如<MASM中的Intel语法>:
mov xmm0, rcx
...
mov rcx, xmm0
这两行分别从生成以下错误消息ml64.exe:
但是,显然有可能在x64中完成此简单任务。例如,以下是一个可运行的x64程序,我可以使用GCC <AT&T语法使用GCC 4.8.2>汇编并运行该程序:
.text
    .globl main
main:
    movl $1, %ecx
    movq %rcx, %xmm0
    movq %xmm0, %rax
    ret
不出所料,该程序的返回值为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
所以我的问题是,鉴于ml64.exe产生上述错误,我该如何在MASM中完成此操作?
我编写了一个简单的 Java 字节码解析器来进行一些实验,最近它在一个意想不到的地方失败了。在读取java/lang/reflect/Member.javaJava 1.1.8.16时rt.jar,我的解析器很生气,因为Member它是这样开始的(注意缺少ACC_ABSTRACT标志):
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...\nJava 1.2.2.17 的版本更正了这一点,并将标志设置为0x0601( ACC_ABSTRACT | ACC_INTERFACE | ACC_PUBLIC)。
我能找到的最早的 JVM 规范(据称是 1.0.2)有这样的说法(\xc2\xa74.1,p.\xc2\xa086,强调):
\n\n\n\n\n接口是隐式抽象的 (\xc2\xa72.13.1);必须设置其
\nACC_ABSTRACT\xef\xac\x82ag 。接口不可能是最终的;如果是的话,它的实现永远无法完成(\xc2\xa72.13.1),因此它无法设置其\xef\xac\x82ag。ACC_FINAL
JVM 规范第 9 版也有类似的话:
\n\n\n如果
ACC_INTERFACE …
在 Java(我通常使用的语言)中,日志库的一个共同特性是能够设置“全局”日志记录级别 -例如,如果级别为WARNING或更高,则发送到日志文件,否则不会,无论完成日志记录的模块。
我想要做的考勤记录是相同的,与结合也只记录到标准错误,而不是文件。
如何?
更新:当控制传递给我的代码时,可执行文件已经启动 - 我正在作为 AWS Lambda 函数运行 - 所以我不确定我是否可以选择在命令行上设置 Glog 状态。我可以用函数调用来做吗?
我都是 GoLang 的新手,我想我只是不了解 Go 的内部逻辑。因为我的思想无法穿透Glog 文档。所以这个问题可能看起来很幼稚。
我有以下数组:
int const A[4] = { 0, 1, 2, 3 };
我想初始化一个重复的数组,如下所示:
int a[4] = A;
如果我在cygwin上运行g ++ 4.8.2如下:
g++ --std=c++11 myfile.cpp
我收到以下错误:
myfile.cpp:16:16: error: array must be initialized with a brace-enclosed initializer
    int a[4] = A;
               ^
然而,显然" int a[4] = { A };"也不会起作用.有没有一种方法来初始化我的数组a从A使用简单的赋值语句,而不诉诸:
int a[4] = { A[0], A[1], A[2], A[3] };
?
java ×4
c++ ×2
c++11 ×2
.class-file ×1
64-bit ×1
android ×1
annotations ×1
assembly ×1
aws-lambda ×1
bytecode ×1
c ×1
classpath ×1
constants ×1
dll ×1
glog ×1
go ×1
gradle ×1
java-9 ×1
java-platform-module-system ×1
jvm ×1
jvm-bytecode ×1
jvmti ×1
masm ×1
module-path ×1
ringtone ×1
windows ×1
x86-64 ×1