小编m3t*_*man的帖子

垃圾收集器是否保证在Out of Memory Error之前运行?

如果堆已满,JVM会抛出一个 OutOfMemoryError.但是它确保在抛出这样的异常之前总是发生(完全)垃圾收集吗?

这意味着当抛出异常时,内存只有强引用对象(或GC Roots可达)才能满.

编辑:假设Sun JVM - HotSpot正在讨论中.

java memory garbage-collection jvm out-of-memory

18
推荐指数
3
解决办法
5853
查看次数

Java 8链式方法参考?

假设有一个典型的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还是其他什么东西?

java lambda java-8 method-reference

16
推荐指数
1
解决办法
7908
查看次数

仅在确定提交但在提交之前拦截事务

Context是Java - 带有Hibernate和Spring的JPA.

我们来看两阶段提交协议的场景(但只有一个资源):

  1. 查询从应用程序提交

  2. 投票是/否(在我们的案例中来自数据库)

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

java spring jpa transactions spring-transactions

16
推荐指数
1
解决办法
933
查看次数

当只有一个实现时,为什么反射返回两个方法?

假设我有这个代码:

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)

java generics reflection inheritance

15
推荐指数
1
解决办法
178
查看次数

运行Junit @Test忽略@ Before/@ After

是否可以@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)

java junit unit-testing

12
推荐指数
1
解决办法
2万
查看次数

什么是Java中的类的签名者?

Class<?>班有一个方法public Object[] getSigners(),其JavaDoc的不解释方法做什么这样的帮助; 在几个类上调用它为我返回null.

谷歌只返回了有关安全例外的信息,没有提到类的签名者; 我已经看到有关从多个jar加载相同类时发生的异常.

Java类的签名者究竟代表什么?是Jar签名时JVM或工具提供的唯一标识符吗?

StackOverflow上有签名者的标签,但它是空的......

java class signer

11
推荐指数
1
解决办法
2163
查看次数

Java EE 5依赖注入?

由于Java EE 5没有CDI,DI如何在这里工作?

EJB是否可以@EJB在非EJB的类中注入?可以在非EJB(容器管理不是本地资源)的类中EntityManager注入吗?或者,将资源引入非EJB类的唯一解决方案是通过JNDI查找?@PersistenceContextEntityManager

非EJB类我指的是没有用@Stateless/ @Statefull或其他注释的类.

java dependency-injection java-ee ejb-3.0 java-ee-5

8
推荐指数
1
解决办法
2469
查看次数

JPA Creation - Hibernate没有在平台上显示

我正在尝试使用Hibernate创建一个JPA项目作为持久性提供程序.但是当我点击平台时,它没有显示Hibernate.它显示了Platform下拉框下的Generic和EclipseLink.我应该怎么做才能在下拉框中获取Hibernate?有什么想法吗?提前致谢

java hibernate jpa

7
推荐指数
1
解决办法
4676
查看次数

使用Guava EventBus进行Java多线程处理

我正在使用番石榴事件总线.我有一个类似服务器的对象应该一直在运行,监听要发布给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线程上做错了吗?

java multithreading guava event-bus

6
推荐指数
1
解决办法
5524
查看次数

我可以在测试运行时跳过JUnit测试吗?

假设我想从我的IDE(Intellij IDEA或eclipse)4000 JUnit测试手动运行; 前1000次测试运行非常顺利(比如他们需要3分钟全部1000次),但测试1001单独使用超过30分钟.有没有办法可以跳过测试1001(当它仍在运行时)并让测试1002(和其他人)继续前进.我不想@Ignore测试1001并重新运行套件,因为我已经有测试1-1000的答案; 我也不想选择1001-4000测试,因为它需要太多时间.

我会使用某种按钮 - 跳过电流测试 - 可以在测试运行时按下.

如果不存在此类功能,IDE开发人员或JUnit开发人员需要对其进行增强吗?

java testing junit

5
推荐指数
3
解决办法
4276
查看次数