前几天我偶然发现了一些不便,java.util.ServiceLoader并在我身上形成了一些问题.
假设我有一个通用服务:
public interface Service<T> { ... }
Run Code Online (Sandbox Code Playgroud)
我无法明确告诉只ServiceLoader加载具有特定泛型类型的实现.
ServiceLoader<Service<String>> services =
ServiceLoader.load(Service.class); // Fail.
Run Code Online (Sandbox Code Playgroud)
我的问题是:什么是合理的方法ServiceLoader来安全地加载通用服务的实现?
在询问了上述问题之后,在Paŭlo的回答之前,我已经设法找到了解决方案.
public interface Service<T> { ...
// true if an implementation can handle the given `t' type; false otherwise.
public boolean canHandle(Class<?> t) { ...
public final class StringService implements Service<String> { ...
@Override public boolean canHandle(Class<?> t) {
if (String.class.isAssignableFrom(type))
return true;
return false;
}
public final class DoubleService implements Service<Double> { ...
// ...
public …Run Code Online (Sandbox Code Playgroud) 我已将Eclipse项目设置Compiler compliance level为1.6
但我得到的错误如下面的截图:Syntax error, annotations are only available if source level is 1.5.
我已经刷新/清理/重启Eclipse至少10次.
它与Maven2编译良好.Eclipse项目由Maven2生成.
该项目使用java-6-openjdk

可能重复:
如何从Java设置环境变量?
我正在尝试设置一个环境变量,并将其读回以验证它是否已实际设置.
我有以下内容:
import java.io.IOException;
public class EnvironmentVariable
{
public static void main(String[] args) throws IOException
{
Runtime.getRuntime().exec("cmd.exe set FOO=false");
String s = System.getenv("FOO");
System.out.println(s);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它似乎FOO始终为null,这意味着它可能未正确设置.
我的exec命令是否正确?javadocs声明它可以将一个字符串参数作为命令.
有任何想法吗?
我们的情况是,我们的Spring连接了一些包含使用Java 6构建的ActiveMQ类的bean.我们的应用程序在客户的服务器上运行,因此我们无法保证它们安装了Java 6或更高版本.如果它们恰好具有Java 5,则应用程序无法启动,因为BeanCreationException具有依赖于ActiveMQ的类的s(根本原因是a UnsupportedClassVersionError).
所以我的问题是,有没有办法忽略a BeanCreationException仍然启动应用程序?我希望能够显示一条错误消息,说明他们需要安装Java 6或更高版本,但由于应用程序甚至无法启动,我从来没有机会这样做.
我的预感是没有办法做到这一点,因为Spring需要能够保证我的应用程序在初始化后正确构建,但我想我还是会问.关于如何实现我的最终目标的任何其他建议也将有所帮助和赞赏.
我们正在使用Spring 3.0.6
谢谢!
我最近注意到,自从我更新到Java 7以来,我的代码的特定部分运行速度明显变慢.令人惊讶的是,Java 7的全局速度比Java 6快.
该程序非常庞大,但我成功地提取了一个可重现的代码来演示java 7如何比Java 6慢.
如果您使用Java 6和Java 7运行完全相同的代码,您会发现Java 7比Java 6慢大约7-8倍!
这是代码(不要试图理解它的作用,它只是来自真实代码的摘要,因此并没有真正意义).它基本上是一个解析字符串以格式化其中某些部分的代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
public class CPerfJava7 extends JFrame {
private static final long serialVersionUID = 1L;
// +==============================================================+
// | Attributes |
// +==============================================================+
JPanel mainPanel;
public CPseudoHtmlDocument docu;
private static long totalTime = …Run Code Online (Sandbox Code Playgroud) 是否可以在Mac OS 10.5上安装最新的JDK?考虑到Apple提供的版本是1.5,最好的选择是什么?
更新:我正在尝试安装JDeveloper 11,它需要JDK 6.
在查看我的代码覆盖率时,我注意到很多单元测试无法检查最终块,这些块试图关闭finally块中的打开InputStreams.
一个示例摘录是:
try {
f = new BufferedInputStream(new FileInputStream(source));
f.read(buffer);
} finally {
if (f != null)
try {
f.close();
} catch (IOException ignored) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有适当的解决方案来使用JUnit4检查finally块内的所有内容?
我知道在保持最高生产力的同时,无法实现100%的代码覆盖率.然而,这些红线在报告中引人注目.
我有一个swing应用程序,我想通过将外部文件从Windows资源管理器拖到应用程序来导入外部文件.我有这个基本功能.但是,我想将默认的拖放光标图标更改为适用于应用程序的光标.在按下鼠标键并将其保持在应用程序上时,我无法更改用户可见的光标.如果拖放操作在同一个swing应用程序中,我已经看到了这个工作的示例.我试图使用DragGestureListener和DragSource来实现这一点无济于事.似乎除非拖动源在摆动范围内,否则不会调用这些方法.将外部文件拖动到swing应用程序时是否可以更改拖动光标?
请看这个简化的例子:
public class DnDTemplate extends JFrame {
private static final long serialVersionUID = 1L;
private JComponent thePane = null;
private Cursor dropCursor = null;
public DnDTemplate() {
super( "Drop File Here" );
thePane = (JComponent) getContentPane();
thePane.setTransferHandler( new DndTransferHandler() );
ImageIcon imageIcon = new ImageIcon( "drop_here.gif" );
Image image = imageIcon.getImage();
BufferedImage bufferedImage = new BufferedImage( 16, 16, BufferedImage.TYPE_INT_ARGB );
Graphics graphics = bufferedImage.getGraphics();
graphics.drawImage( image, 0, 0, null );
dropCursor = Toolkit.getDefaultToolkit().createCustomCursor( bufferedImage, new Point( 16, 16 ), …Run Code Online (Sandbox Code Playgroud) 我已经编写了许多测试,不仅分为不同的类,而且根据我们正在测试的应用程序的哪个区域划分为单独的子包.所以,我的包结构看起来有点像这样:
my.package.tests
my.package.tests.four
my.package.tests.one
my.package.tests.three
my.package.tests.two
Run Code Online (Sandbox Code Playgroud)
在my.package.tests包中我有一个父类,子包中的所有测试都是一到四个扩展.现在,我想选择运行测试的顺序; 不在类中(这似乎可以通过FixMethodOrder注释)但是类或子包本身的顺序(所以那些在子包中one,然后在那些中two,等等).一些测试类使用参数化运行器,以防万一有所不同.测试成功不需要选择顺序,它们是相互独立的; 然而,对它们进行排序以反映通常使用程序的各个部分的顺序是有帮助的,因为它使分析更容易一些.
现在,理想情况下我想要一些配置文件告诉JUnit应该执行哪些测试顺序; 不过我猜它不会那么容易.我在这里有哪些选项,最简单的选项是什么?我也更喜欢只需列出子包,而不是包中的各种类,甚至是类中的测试函数.
我正在使用Java 1.6.0_26(我在这里没有选择)和JUnit 4.11.
我的项目之一的构建开始失败,下面给出了例外情况
> Could not resolve org.slf4j:slf4j-api:[1.6.1,).
> Failed to list versions for org.slf4j:slf4j-api.
> Unable to load Maven meta-data from https://repo1.maven.org/maven2/org/slf4j/slf4j-api/maven-metadata.xml.
> Could not GET 'https://repo1.maven.org/maven2/org/slf4j/slf4j-api/maven-metadata.xml'.
> Received fatal alert: protocol_version
Run Code Online (Sandbox Code Playgroud)
环境:
java-6 ×10
java ×9
java-7 ×2
junit4 ×2
swing ×2
eclipse ×1
gradle ×1
java-5 ×1
junit ×1
macos ×1
maven ×1
performance ×1
runtime.exec ×1
spring ×1
unit-testing ×1