如果堆已满,JVM会抛出一个
OutOfMemoryError.但是它确保在抛出这样的异常之前总是发生(完全)垃圾收集吗?
这意味着当抛出异常时,内存只有强引用对象(或GC Roots可达)才能满.
编辑:假设Sun JVM - HotSpot正在讨论中.
假设有一个典型的Java Bean:
class MyBean {
void setA(String id) {
}
void setB(String id) {
}
List<String> getList() {
}
}
Run Code Online (Sandbox Code Playgroud)
我想在BiConsumer的帮助下创建一种更抽象的方式来调用setter:
Map<SomeEnum, BiConsumer<MyBean, String>> map = ...
map.put(SomeEnum.A, MyBean::setA);
map.put(SomeEnum.B, MyBean::setB);
map.put(SomeEnum.List, (myBean, id) -> myBean.getList().add(id));
Run Code Online (Sandbox Code Playgroud)
有没有一种方法,以取代拉姆达(myBean, id) -> myBean.getList().add(id)与链接的方法引用,类似(myBean.getList())::add或者myBean::getList::add还是其他什么东西?
Context是Java - 带有Hibernate和Spring的JPA.
我们来看两阶段提交协议的场景(但只有一个资源):
查询从应用程序提交
投票是/否(在我们的案例中来自数据库)
3.1.如果是,来自数据库
3.1.1.(在代码中进行回调) - 不是协议的一部分
3.1.2.提交数据库
3.2如果没有
3.2.1回滚到数据库
我想要的是一种在代码中从3.1.1进行回调的方法,但只有当知道事务将被提交但在实际提交之前.此外,如果在此处抛出异常,则应回滚该事务.
使用TransactionSynchronizationSpring中的(*),允许您在事务提交/完成之前或提交/完成之后拦截事务.
beforeCommit() 回调说在调用方法后仍然可以发生回滚; beforeComplete() 即使交易失败也会被调用afterCommit/Complete() 在事务实际提交到数据库之后调用,并且无法回滚. 现在我看起来似乎我想要的是另一个完整的两阶段提交协议; 但我想知道Spring中是否有解决方法.区别在于回调中完成的调用无法回滚.
来自Spring 4.2的(*)非常简单,@TransactionalEventListener并且TransactionPhase很好地抽象TransactionSynchronization
public interface Address {
public int getNo();
}
public interface User<T extends Address> {
public String getUsername();
public T getAddress();
}
public class AddressImpl implements Address {
private int no;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
}
public class UserImpl implements User<AddressImpl> {
private String username;
private AddressImpl addressImpl;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public AddressImpl getAddress() { …Run Code Online (Sandbox Code Playgroud) 是否可以@Test在具有注释方法的类中运行JUnit 方法@Before,但是@Before仅忽略此方法的方法?
编辑:我感兴趣的是JUnit是否支持此功能,而不是解决方法.我知道一些变通方法,比如在另一个类中移动测试或删除注释并手动调用setUp()每个测试方法.
假设在一个类中有30个测试,其中29个@Before真正简化了测试初始化,但是对于它们中的一个(或多个)是无用的/它使事情变得复杂.
public class MyTestClass {
@Before
public void setUp() {
//setup logic
}
@Test
public void test1() {
//[...]
}
@Test
public void test2() {
//[...]
}
//more tests here
@Test(ignoreBefore = true, ignoreAfter = true //false by default)
//something equivalent to this
public void test20() {
//[...]
}
}
Run Code Online (Sandbox Code Playgroud) 该Class<?>班有一个方法public Object[] getSigners(),其JavaDoc的不解释方法做什么这样的帮助; 在几个类上调用它为我返回null.
谷歌只返回了有关安全例外的信息,没有提到类的签名者; 我已经看到有关从多个jar加载相同类时发生的异常.
Java类的签名者究竟代表什么?是Jar签名时JVM或工具提供的唯一标识符吗?
StackOverflow上有签名者的标签,但它是空的......
由于Java EE 5没有CDI,DI如何在这里工作?
EJB是否可以@EJB在非EJB的类中注入?可以在非EJB(容器管理不是本地资源)的类中EntityManager注入吗?或者,将资源引入非EJB类的唯一解决方案是通过JNDI查找?@PersistenceContextEntityManager
非EJB类我指的是没有用@Stateless/ @Statefull或其他注释的类.
我正在尝试使用Hibernate创建一个JPA项目作为持久性提供程序.但是当我点击平台时,它没有显示Hibernate.它显示了Platform下拉框下的Generic和EclipseLink.我应该怎么做才能在下拉框中获取Hibernate?有什么想法吗?提前致谢
我正在使用番石榴事件总线.我有一个类似服务器的对象应该一直在运行,监听要发布给b us的事件.所以在junit测试中(MyObject是测试中的类),我在它自己的线程中创建它来模拟这个并阻止阻塞:
@Test
public void test() {
EventBus eventBus = new EventBus();
Thread thread= new Thread() {
@Override
public void run()
{
logger.debug("Creating new thread");
MyObject myObject = new MyObject(eventBus);
}
};
thread.start();
...
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,myObject是在自己的线程Thread1中创建的.然后,我在测试中将事件发布到事件总线:
eventBus.post(triggerObject);
Run Code Online (Sandbox Code Playgroud)
我发现的奇怪的事情是,我在MyObject类中的订阅方法的所有操作/日志记录都在主线程中再次执行.myObject等待来自某些其他部分的响应,这会阻止我的测试,因为它在主线程中.为什么会这样?我在EventBus或Java线程上做错了吗?
假设我想从我的IDE(Intellij IDEA或eclipse)4000 JUnit测试手动运行; 前1000次测试运行非常顺利(比如他们需要3分钟全部1000次),但测试1001单独使用超过30分钟.有没有办法可以跳过测试1001(当它仍在运行时)并让测试1002(和其他人)继续前进.我不想@Ignore测试1001并重新运行套件,因为我已经有测试1-1000的答案; 我也不想选择1001-4000测试,因为它需要太多时间.
我会使用某种按钮 - 跳过电流测试 - 可以在测试运行时按下.
如果不存在此类功能,IDE开发人员或JUnit开发人员需要对其进行增强吗?