我运行sed在Windows上进行一些替换,我注意到它会自动将行结尾转换为Unix(\n).是否可以选择告诉sed使用Windows行结尾(\ r \n),甚至更好地保留文件中的行结尾?
注意:我使用unxutils中的sed:http://unxutils.sourceforge.net/
考虑以下程序:
public class GenericTypeInference {
public static void main(String[] args) {
print(new SillyGenericWrapper().get());
}
private static void print(Object object) {
System.out.println("Object");
}
private static void print(String string) {
System.out.println("String");
}
public static class SillyGenericWrapper {
public <T> T get() {
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它在Java 8下打印"String",在Java 7下打印"Object".
我原以为这是Java 8中的歧义,因为两种重载方法都匹配.为什么编译器print(String)在JEP 101之后选择?
是否合理,这会破坏向后兼容性,并且在编译时无法检测到更改.升级到Java 8后,代码只是偷偷摸摸地表现不同.
注意:由于SillyGenericWrapper某种原因,它被命名为"愚蠢".我试图理解为什么编译器的行为方式,不要告诉我这个愚蠢的包装器首先是一个糟糕的设计.
更新:我还尝试在Java 8下编译和运行示例,但使用的是Java 7语言级别.这种行为与Java 7一致.这是预期的,但我仍然觉得需要验证.
我想为传输对象定义自己的注释,并包含一些Lombok注释作为元注释:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Data
@NoArgsConstructor
@AllArgsConstructor
public @interface TransferObject {
}
Run Code Online (Sandbox Code Playgroud)
目的是用我的所有传输对象注释@TransferObject并"继承"上述所有内容.在实践中它不起作用,注释的类@TransferObject不由Lombok处理.
有没有办法让这个工作?如果没有,理论上可以增强Lombok来寻找元注释吗?
注意:我在使用Java 8.
更新:在github上看起来有一个功能请求.
我们在项目中使用来自https://code.google.com/p/concurrentlinkedhashmap/的 ConcurrentLinkedHashMap ,我看到了一条说明,它在2010年被集成到了Guava的MapMaker和CacheBuilder中.信息非常简短:
将算法技术集成到MapMaker中将在Google Guava r08中发布,并且很大程度上基于此版本.
这究竟是什么意思?
以下代码:
public static void main(String[] args) {
Collections.singleton(1).stream().forEach(i -> new Exception().printStackTrace());
}
Run Code Online (Sandbox Code Playgroud)
打印:
java.lang.Exception
at PrintLambdaStackTrace.lambda$main$0(PrintLambdaStackTrace.java:6)
at PrintLambdaStackTrace$$Lambda$1/1831932724.accept(Unknown Source)
at java.util.Collections$2.tryAdvance(Collections.java:4717)
at java.util.Collections$2.forEachRemaining(Collections.java:4725)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at PrintLambdaStackTrace.main(PrintLambdaStackTrace.java:6)
Run Code Online (Sandbox Code Playgroud)
lambda调用是如何实现的?为什么有2个堆栈帧?
在使用批处理文件多年后,我惊讶地发现等号'='被认为是一个参数分隔符.
鉴于此测试脚本:
echo arg1: %1
echo arg2: %2
echo arg3: %3
Run Code Online (Sandbox Code Playgroud)
和调用:
test.bat a=b c
Run Code Online (Sandbox Code Playgroud)
输出是:
arg1: a
arg2: b
arg3: c
Run Code Online (Sandbox Code Playgroud)
为什么这样,怎么可以避免?我不希望脚本的用户考虑到这个怪癖并引用"a = b",这是违反直觉的.
此批处理脚本在Windows 7上运行.
=====编辑=====
更多背景:我在编写bat文件以启动Java应用程序时遇到了这个问题.我想在bat文件中使用一些args,然后将其余的传递给java应用程序.所以我的第一次尝试是做shift,然后重建args列表(因为%*不受影响shift).它看起来像这样,就在我发现问题的时候:
rem Rebuild the args, %* does not work after shift
:args
if not "%1" == "" (
set ARGS=!ARGS! %1
shift
goto args
)
Run Code Online (Sandbox Code Playgroud)
下一步是不再使用shift,而是通过一次删除一个字符%*直到遇到空格来手动实现移位:
rem Remove the 1st arg if it was the profile
set ARGS=%*
if not "%FIRST_ARG%" == "%KNOA_PROFILE%" goto …Run Code Online (Sandbox Code Playgroud) 考虑下面MockUp的一个类的示例,该类在构造函数Foo中进行拦截Bar,然后toString()根据其实现Bar;
public class FooStub extends MockUp<Foo> {
private Bar bar;
@Mock
public void $init(Bar bar) {
this.bar = bar;
}
@Mock
public String toString() {
return bar.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
如果Foo恰好覆盖toString()所有工作正常.否则,你得到一个IllegalArgumentException:"找不到以下模拟的真实方法".我从这里理解JMockit不查看基类,因此无法找到一个toString()模拟方法.
假设我无法修改Foo类(实际上我可以,但仅仅是为了参数),有没有办法toString()只为这个Foo类进行模拟?
要清楚,我想模拟这个类的所有实例,而不仅仅是一个实例(具有不需要的简单解决方案MockUp).
我们有几十个带有maven构建和eclipse作为IDE的java项目.现在我想在这些项目中添加对groovy的支持,所以我不可避免地要使用gmaven插件进行集成.不幸的是,gmaven现在似乎已经放弃了(没有网站更新,JIRA几乎没有任何活动).
考虑到groovy,maven和eclipse是成熟的软件,混合的java/groovy项目并不罕见,我希望有一个可靠的集成解决方案.我知道有些人将他们的构建移动到gradle,但我不愿意为我们的项目添加常规支持而做出如此重大的改变.
那么你们其他人如何处理maven/eclipse环境中的混合groovy/java项目呢?groovy社区推荐的工具链是什么?
注意:我在某种程度上能够通过JIRA的一些源代码修复得到gmaven使用groovy 1.8,但我不认为这是未来的可靠策略.
考虑将更改应用于聚合表的问题.必须更新存在的行,同时必须插入新行.我的方法如下:
SQL(带有SORT MERGE提示)如下所示(没什么特别的):
merge /*+ USE_MERGE(t s) */
into F_SCREEN_INSTANCE t
using F_SCREEN_INSTANCE_BUF s
on (s.DAY_ID = t.DAY_ID and s.PARTIAL_ID = t.PARTIAL_ID)
when matched then update set
t.ACTIVE_TIME_SUM = t.ACTIVE_TIME_SUM + s.ACTIVE_TIME_SUM,
t.IDLE_TIME_SUM = t.IDLE_TIME_SUM + s.IDLE_TIME_SUM
when not matched then insert values (
s.DAY_ID, s.PARTIAL_ID, s.ID, s.AGENT_USER_ID, s.COMPUTER_ID, s.RAW_APPLICATION_ID, s.APP_USER_ID, s.APPLICATION_ID, s.USER_ID, s.RAW_MODULE_ID, s.MODULE_ID, s.START_TIME, s.RAW_SCREEN_NAME, s.SCREEN_ID, s.SCREEN_TYPE, s.ACTIVE_TIME_SUM, s.IDLE_TIME_SUM)
Run Code Online (Sandbox Code Playgroud)
该F_SCREEN_INSTANCE表具有(DAY_ID, PARTIAL_ID)主键,也是IOT(索引组织表).这使其成为合并连接的理想候选者:行按查找键进行物理排序.
到现在为止还挺好.我已经开始了一个基准测试,初始时间看起来不错,合并时间为10秒.但大约一个小时后,合并大约需要4分钟,因为tempdb使用率很高(每个合并4GB).下面的查询计划显示F_SCREEN_INSTANCE在合并之前重新排序,即使表已经理想地排序.当然,随着表的增长,将需要更多的tempdb,整个方法就会崩溃.

好的,为什么要重新排序表呢?它变成了合并连接实现的限制:第二个表总是排序的.
如果存在索引,则数据库可以避免对第一个数据集进行排序.但是,无论索引如何,数据库始终会对第二个数据集进行排序.
O ... K,那么我可以将主表放在第一位,将缓冲放在第二位吗?不,那也不可能.无论我如何列出USE_MERGE …
它没有操作吗?JVM是否避免再次调用关闭挂钩?
对于一个用例,考虑一个为SomeException调用System.exit()的UncaughtExceptionHandler,然后在短时间内在两个单独的线程中抛出SomeException.
此外,假设在新线程中调用System.exit()以避免潜在的死锁.
UPDATE
正如其中一条评论正确地指出的那样,我应该自己测试一下,但我很懒.无论是在常规线程还是守护程序线程中调用System.exit()并在打印后以代码1退出,下面的测试都会成功完成:
Requesting shutdown ...
Shutdown started ...
Requesting shutdown ...
Shutdown completed ...
Run Code Online (Sandbox Code Playgroud)
以下是代码:
public class ConcurrentSystemExit {
private final static boolean DAEMON = false;
public static void main(String[] args) throws InterruptedException {
// Register a shutdown hook that waits 6 secs
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
System.out.println("Shutdown started ...");
Thread.sleep(6000);
System.out.println("Shutdown completed ...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// Define a Thread that calls exit()
class ShutdownThread …Run Code Online (Sandbox Code Playgroud) java ×6
java-8 ×2
annotations ×1
batch-file ×1
caching ×1
eclipse ×1
generics ×1
groovy ×1
guava ×1
jmockit ×1
lambda ×1
lombok ×1
maven ×1
mocking ×1
oracle ×1
performance ×1
sed ×1
unit-testing ×1
windows ×1