在HibernateDaoSupport的子类中有如下语句:List retValue=getHibernateTemplate().find("from ViewAttachAuth where 1=1"),其中ViewAttachAuth是自定义的实体对象,映射到数据库中的一个视图,按理说retValue应该是一个类型为ArrayList的对象,并且retValue中的每一个元素都是ViewAttachAuth对象,可是我在调试的时候发现返回对象的toString()方法得到的竟然是"com.sun.jdi.InvocationException occurred invoking method.",和普通的ArrayList对象的toString方法显然是不一样的,但是如果把它当做List接口来使用的话并不会出现问题,而如果System.out.println(retValue)的话则会出现java.lang.StackOverflowError堆栈溢出的错误,造成程序崩溃。综合网上的相关帖子以及自己使用Hibernate的经验初步断定这个现象和Hibernate的缓存以及延迟加载策略相关,不过ViewAttachAuth对应的视图中的记录并不多,只有四五条,在这么小的数据量的情况下Hibernate不至于启动二级缓存什么的吧,看来还得好好想想是怎么回事。
接下来的几分钟里我的脑海中一直出现一个字符串:toString,会不是toString这个方法本身的问题呢。按照这个思路我检查了我自己的实体类ViewAttachAuth,发现它的toString方法是下面这样定义的。
public String toString() {
return org.apache.commons.lang.ObjectUtils.toString(this);
}
于是我尝试着改成下面这样:
public String toString() {
StringBuffer sb=new StringBuffer("[");
sb.append("lsh="+getLsh()+",");
sb.append("aname="+getAname()+",");
sb.append("asize="+getAsize()+",");
sb.append("description="+getDescription()+",");
return sb.toString();
}
很不幸(^_^),问题解决了。于是我忍不住想看看org.apache.commons.lang.ObjectUtils.toString(Object obj)的源码,看看里面究竟有什么魔力让我的程序崩溃,接下来的一幕让我惊呆了,下面是ObjectUtils中toString方法的源码片段:
public static String toString(Object obj) {
return obj == null ? "" : obj.toString();
}
看到这里我最初的toString方法能引起程序崩溃也就不足为奇了:又是死循环!程序员的宿敌!
分享到:
相关推荐
解决Failed to connect to remote VM com.sun.jdi.connect.spi.ClosedConnectionException错误,tomcat远程调试
最近升级到2020.1,出现cannot load a jdk class: com.sun.jdi.Field 可以直接修改 修改前 IDEA_JDK_64=C:\Program Files\Java\jdk1.8.0_144 修改后 IDEA_JDK_64=C:\Program Files\JetBrains\IntelliJ IDEA 2019.3...
这种方式可以有效解决由于部署环境差异导致的问题定位困难,尤其是在分布式系统和微服务架构中,远程调试更是必不可少的技能之一。 ### Java远程调试的重要性 1. **环境一致性**:通过远程调试,开发人员可以在与...
标题中的"sa-jdi.jar.zip"是一个压缩文件,它包含了名为"sa-jdi.jar"的Java可执行 jar 文件。在Java开发中,JAR(Java Archive)文件是用于打包类库、资源文件以及应用程序的二进制文件。这种格式允许将多个文件组合...
然后比较这两个根节点,如果它们是同一个节点,那么这个节点就是LCA;如果不是,则LCA是它们的共同祖先,即它们的根节点的父节点。 4. 优化查询效率:为了进一步提高查询速度,可以使用预处理的方法,如Tarjan's O...
博文链接:https://tomshen.iteye.com/blog/192140
它扩展了传统的概率论,允许处理不确定性和不完整信息。DSmT的核心是信念函数,它不仅表示单个事件的概率,还表示一组事件的联合信念。在组合公式中,DSmT提供了处理来自不同来源的证据冲突的方法,通过Dempster's ...
在IT行业中,Eclipse是一款广泛使用的Java开发集成环境,它为开发者提供了丰富的功能,包括代码编辑、调试、构建以及版本控制等。Tomcat是Apache软件基金会的开源项目,是一个流行的Java Servlet容器,常用于部署和...
- **JDI (Java Debugger Interface)**:利用 JDI 进行远程调试,可以深入到 javac 的内部运行过程。 - **Javadoc**:阅读官方文档,了解各个类和方法的功能。 - **单元测试**:查看并运行源码中的测试用例,有助于...
import com.sun.jdi.ClassLoaderReference; import com.sun.jdi.VirtualMachine; import com.sun.jdi.VirtualMachineManager; import com.sun.jdi.connect.*; import com.sun.jdi.event.EventSet; import ...
在JDK 1.8中,包含了`com`、`apple`、`org`、`launcher`、`java`、`jdk`、`sun`等目录,这些都是Java标准库的主要组成部分。通过查看源码,开发者可以了解这些包中的类和方法的具体实现,比如`java.util`包中的集合...
JDI, JDI是用于UI测试自动化的测试框架 用户界面测试自动化框架 JavaCI 软件包 版权所有( c ) 2017,EPAM系统许可证:GPL版本的GPL许可。简介JDI - 是UI测试自动化的测试框架。 它扩展了页面对
再如,com.sun.jdi(Java Debug Interface)类库则是Java远程调试接口,允许开发者编写自定义的调试工具。 此外,tools.jar还包含了如com.sun.javadoc、com.sun.tools.attach等其他类库,它们分别用于生成API文档和...
`com.*`和`sun.*`等非公开的包提供了Oracle特定的实现和扩展,虽然不推荐直接使用,但研究这些源码可以帮助我们理解JDK的一些特殊功能,如`sun.misc.Unsafe`提供了对内存操作的直接访问。 6. **启动器** `...
- **com.sun.jdi.request**:封装了调试客户端可以向 JVM 发起的请求,如断点请求、类加载请求等。 其中,与断点相关的接口主要包括: - **BreakpointEvent**:表示 JVM 执行到断点时触发的事件。 - **...
JDI JDI 让Android开发更简单 一.概述 JDI为一组android开发过程中可复用的组件和模式组成 二.JDI能做什么 目标:让开发人员只关注业务逻辑.加快开发速度 1.控件和事件动态绑定 jdi借鉴了ios输出口的概念,与其他框架...
电子行业周报中重点提到了OPPO Reno系列的发布和JDI接受Suwa800亿日元的支援两大事件,以下是这两件事情的具体分析: 1. OPPO Reno系列发布 OPPO Reno系列的发布,是OPPO广东移动通信有限公司推出的新一代旗舰手机...
- `suspend=n`:表示不暂停JVM启动,允许程序立即运行(如果设置为`suspend=y`,则会等待调试器连接后再运行)。 - `address=5005`:指定调试端口。 - 对于**war包项目**,通常是在Tomcat等应用服务器中运行,...
<echo>exe: jdb -connect com.sun.jdi.SocketAttach: hostname=${hostname}, port=${port} <arg line="jdb -connect com.sun.jdi.SocketAttach: hostname=${hostname}, port=${port}"/> ``` 在上面的示例中...