请考虑以下代码:
A.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface A{}
Run Code Online (Sandbox Code Playgroud)
C.java:
import java.util.*;
@A public class C {
public static void main(String[] args){
System.out.println(Arrays.toString(C.class.getAnnotations()));
}
}
Run Code Online (Sandbox Code Playgroud)
编译和运行按预期工作:
$ javac *.java
$ java -cp . C
[@A()]
Run Code Online (Sandbox Code Playgroud)
但是考虑一下:
$ rm A.class
$ java -cp . C
[]
Run Code Online (Sandbox Code Playgroud)
我会期望它抛出一个ClassNotFoundException
,因为@A
缺少.但相反,它会默默地删除注释.
这种行为是在JLS的某个地方记录的,还是Sun的JVM的怪癖?它的基本原理是什么?
这样的事情似乎很方便javax.annotation.Nonnull
(看起来应该是这样@Retention(CLASS)
的)但是对于许多其他注释来说,似乎它可能会导致在运行时发生各种不好的事情.
摘要几乎说明了一切.以下是相关的代码片段ImmutableList.createFromIterable()
:
if (element == null) {
throw new NullPointerException("at index " + index);
}
Run Code Online (Sandbox Code Playgroud)
我已经多次遇到这种情况,并且无法理解为什么通用库函数应该强加这个限制.
编辑1:通过"通用",我对95%的案例感到满意.但我认为我还没有写过100个电话ImmutableList.of()
,并且不止一次被这个电话咬过.不过,也许我是一个离群值.:)
编辑2:我猜我最大的抱怨是,当与标准java.util
集合交互时,这会产生"打嗝" .正如您在演讲中指出的那样,null
集合中s的问题可能会显示在远离插入这些空值的位置.但是,如果我有一长串代码在一端将空值放在标准集合中并在另一端正确处理它们,那么我无法在整个过程中的任何时候替换谷歌集合类,因为它会立即抛出一个NullPointerException
.
我对Josh Stone对sha1缩写碰撞的分析很感兴趣.
让我们说有人写下了一个缩写的提交ID 8b82547e33
,在它明确无误的时候.但从那时起,其他对象已经创建了相同的前缀,所以现在git告诉你(由于某种原因两次):
$ git show 8b82547e33
error: short SHA1 8b82547e33 is ambiguous.
error: short SHA1 8b82547e33 is ambiguous.
fatal: ambiguous argument '8b82547e33': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Run Code Online (Sandbox Code Playgroud)
现在,作为一个人,如果git只是向我展示模糊的对象,我可能会告诉我的意思.我怎样才能实现以下内容?
$ git objects-starting-with 8b82547e33
8b82547e33e: commit: l2tp: Restore socket refcount when sendmsg succeeds
8b82547e338: tree [2 files, 26 subtrees]
Run Code Online (Sandbox Code Playgroud)
(注意:以上示例使用的是http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git的相对最新的克隆.)
比较这种方法:
void doStuff(String val) {
if (val == null) {
val = DEFAULT_VALUE;
}
// lots of complex processing on val
}
Run Code Online (Sandbox Code Playgroud)
...对于这种方法:
void doStuff(String origVal) {
String val = origVal;
if (val == null) {
val = DEFAULT_VALUE;
}
// lots of complex processing on val
}
Run Code Online (Sandbox Code Playgroud)
对于前一种方法,Eclipse会发出警告"不应分配参数'val'".为什么?
在我看来,前者更清洁.首先,它并没有迫使我想出两个好名字val
(想出一个好的名字就足够了).
(注意:假设val
封闭类中没有命名的字段.)
我正在将.jar
其全局lib/
目录中包含71个文件的构建转换为使用Maven.当然,在这个项目的历史过去十年中,许多开发人员已经从Web上撤下了这些内容,并且并不总是将所有必需的版本信息等添加到VCS中.
是否有一种简单,自动的方式从该组.jar
文件转到<dependency/>
我的pom.xml
文件中使用的相应元素?我希望有一个网页,我可以提交jar文件的校验和,并获取XML片段.谷歌搜索'maven存储库搜索'基本上只是找到基于名称的搜索.而http://repo1.maven.org/已经没有任何搜索,据我所看到的.
更新:GrepCode看起来可以找到给定MD5校验和的项目.但它没有提供Maven需要的特定细节(groupId
,artifactId
).
这是我根据接受的答案提出的脚本:
#!/bin/bash
for f in *.jar; do
s=`md5sum $f | cut -d ' ' -f 1`;
p=`wget -q -O - "http://www.jarvana.com/jarvana/search?search_type=content&content=${s}&filterContent=digest" | grep inspect-pom | cut -d \" -f 4`;
pj="http://www.jarvana.com${p}";
rm -f tmp;
wget -q -O tmp "$pj";
g=`grep groupId tmp | head -n 1 | cut -d \> -f 3 | cut -d \< -f 1`;
a=`grep …
Run Code Online (Sandbox Code Playgroud) 当客户安装了7u45更新后,我们的应用程序 停止 工作,我们想知道未来我们还可以做些什么来预先准备好这些更新并避免发布日支持噩梦.
(根据Java版本编号方案,计划于1月14日发布的下一个重要补丁更新将为7u51.下一个有限更新(未知日期)将为7u60.)
我在Oracle和OpenJDK网站上搜索过,并没有找到任何特别有用的东西.Java SE的主要Oracle页面具有Early Access Downloads部分.它有三个有潜力的链接,但不会成功:
https://jdk7.java.net/,仍然谈到7u40 - 没有提到7u45,更不用说7u51或7u60了.
http://openjdk.java.net/projects/jdk7u/,上面写着"我们在jdk7u-dev森林中开放修复7u60",但似乎没有提供任何预先构建的二进制文件.我也不清楚部署组件(applet插件和webstart)是我们过去兼容性问题的主要来源,甚至是OpenJDK的一部分.
在Java的兼容性和性能计划听起来像我想要的东西,但没有人知道如何注册它.
我上面提到的第二个问题的答案指向了8月份提交的OpenJDK错误报告.(它有一个"CAP"标签,可能代表"兼容性和性能"?)很明显,有些人能够针对这些更新测试他们的应用程序.关于如何加入该俱乐部的任何指示都非常感谢!
我想写一些像这样的代码:
Object o = ...;
String oTypeName = o.getClass().getName();
//on the other side of the wire:
Class<?> oClass = Class.forName(oTypeName);
Object oAgain = oClass.newInstance();
Run Code Online (Sandbox Code Playgroud)
但是,从javadoc中我不应该使用哪种方法来初始化oTypeName
,即哪种方法会产生预期的输入Class.forName()
:
getCanonicalName()
:"返回由Java语言规范定义的基础类的规范名称.如果基础类没有规范名称(即,如果它是本地或匿名类或组件类型不具有的数组,则返回null)一个规范的名字.)"getName()
:"返回此Class对象表示的实体名称(类,接口,数组类,基本类型或void),作为String.如果此类对象表示不是数组类型的引用类型,则为二进制名称按照Java™语言规范的规定返回类的类."getTypeName()
:"返回此类型名称的信息字符串."很明显,我不想要其中任何一个:
getSimpleName()
:"返回源代码中给出的基础类的简单名称."toString()
:"字符串表示形式是字符串"class"或"interface",后跟一个空格,然后是getName返回的格式的类的完全限定名称"我不希望这对原始类型起作用.如果它不适用于数组也没关系.我关心的主要问题是嵌套类和Foo.Bar
对比Foo$Bar
.
该javadoc的和教程有关于四个小应用程序的生命周期方法的信息(init() -> start() -> stop() -> destroy()
).但他们大多用抽象语言交谈.
我正在寻找的是具体的例子,如果我把我的代码放在init
vs中start
,并且同样对于destroy
vs ,它会有所不同stop
.到目前为止我唯一发现的是教程对destroy
方法的描述.它说:
注意:尽可能缩短destroy方法的实现,因为无法保证此方法将完全执行.Java虚拟机可能会在长破坏方法完成之前退出.
(我有点震惊,上面的内容不在javadoc中.)
编辑:更具体一点:任何人都可以提供浏览器+ JVM组合,在某些特定操作(切换选项卡,点击"后退"按钮等)时,调用stop
但不调用destroy
(或start
不调用init
)?
我的git树中有一个文件:
$ git ls-files | grep /Expression.java
sm/src/main/java/cl/utilities/sm/Expression.java
Run Code Online (Sandbox Code Playgroud)
我想得到它的活动日志,而不必输入整个路径.基本上我想要这个输出:
$ git log --oneline -2 sm/src/main/java/cl/utilities/sm/Expression.java
2718cdc cleaned up some warnings
f30cf15 Added missing @Overrides
Run Code Online (Sandbox Code Playgroud)
......但无需打字sm/src/main/java/cl/utilities/sm
.我尝试了很多东西,但没有一个有效:
$ git log -- \*/Expression.java
$ git log -- \*Expression.java
$ git log -- \*\*/Expression.java
$ git log -- '*/Expression.java'
$ git log -- '**/Expression.java'
Run Code Online (Sandbox Code Playgroud)