java程序调试的5种方法

java程序调试的5种方法,第1张

1.debug。断点调试。

2.输出消息。system.out.println();来调试。

3.动态代理(Dynamic Proxy)。动态代理是一个特定的Java特性,它允许开发者引入proxy类,加进某一给定类之前,并通过某一给定接口截获所有调用。你可以在很短时间内用一个普通代理设置一个虚拟事件处理器,来查看事件发生顺序。当需要理解事件处理器时这是最简单和快捷的方法。

4.运行时剖析器(Run-time Profiler)。剖析器是通过特定的JVM hooks在系统中跟踪所有调用的强大工具。但是用它来跟踪执行过程是大才小用。

5.Aspects。面向方面编程。它是截获你的代码执行既快速又容易的方法。你可以围绕方法、构造器、属性访问等等有选择地设置hook,而不需要修改原始代码。在这些hook中,你可以打印调试消息。

1.2常用的。3.4.5网上找的。

实现起来比较麻烦,不推荐用。还是用用FineReport吧,绝对的报表软件NO.1

birt动态SQL实现有三种方式:拼接SQL、绑定变量和让应用程序拼接,birt得到返回结果集方式。

1.拼接SQL方式

数据集中写SQL,如下:

select id ,code,name,type

from type

选中数据集,点script方式,在beforeOpen事件中写如下SQL:

var type = reportContext.getParameterValue("type")

var name = reportContext.getParameterValue("name")

var query = this.queryText

if(type!=null){

query = query + " and type = "+type

}

if(name!=null&&name!=""){

query = query + " and name = '"+name+"'"

}

this.queryText = query

然后就可以了,当然,也可以不写第一步,直接所有的SQL都在beforeOpen中拼接。

但是,拼接SQL方式不仅复杂容易错,还会导致SQL注入风险。

2.绑定变量方式

在数据集的SQL中写如下SQL

select id ,code,name,type

from location

where (type = ? or ? is null )

and ( name = ? or ? is null )

然后配置数据集的参数,如下图:

最后一项是链接报表的参数。倒数第二项是默认值,填null

这种方式不会有SQL注入风险。

另外如果想要查看执行的SQL,可以在数据集的SCRIPT的beforeOpen事件写如下脚本:

importPackage( Packages.java.io )

out = new PrintWriter( new FileWriter("c:/debuginfo.txt", true ) )

out.println("queryText:-->"+ this.queryText)

out.close()

第三种是在应该程序处理查询,BIRT负责取出结果集展示,采用的是BIRT+SPRING+MYBATIS。

当然这里MYBATIS也可以是其它框架,思路一样。

BirtBeanFactory.java

public class BirtBeanFactory {

private static BeanFactory ctx

public synchronized static void setBeanFactory(BeanFactory beanFactory) {

ctx = beanFactory

}

public static Object getBean(String str) {

return ctx.getBean(str)

}

public static <T>T getBean(Class<T>clazz) {

return ctx.getBean(clazz)

}

}

GlobalInitializer.java

public class GlobalInitializer implements InitializingBean ,BeanFactoryAware{

private BeanFactory beanFactory

@Override

public void afterPropertiesSet() throws Exception {

BirtBeanFactory.setBeanFactory(beanFactory)

}

@Override

public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

this.beanFactory = beanFactory

}

}

BirtDataFactory.java

public class BirtDataFactory {

private TestService manager = (TestService) BirtBeanFactory.getBean(TestService.class)

public List<Location>findListByDto(LocationDto dto){

return manager.findListByDto(dto)

}

}

spring配置文件配置下:

<bean id="globalInitializer" class="com.test.birt.core.GlobalInitializer"/>

这样代码层就完成了,

在birt中创建脚本数据源

创建脚本数据集,在数据集的open事件中写这样的方法:

importPackage(Packages.com.test.birt.core)

importPackage(Packages.com.test.birt.report.dto)

factory = new BirtDataFactory()

dto = new TestDto()

dto.setCreateTimeStart(reportContext.getParameterValue("createTimeStart"))

dto.setCreateTimeEnd(reportContext.getParameterValue("createTimeEnd"))

if(reportContext.getParameterValue("dcId")!=null){

dto.setDcId(reportContext.getParameterValue("dcId").longValue())

}

collectList=factory.findListByDto(dto)

iterator = collectList.iterator()

在fecth阶段,写这样 的代码:

if(iterator.hasNext() == false ){

return false

} else{

var collectBean = iterator.next()

row["id"]=collectBean.getId()

row["name"] = collectBean.getName()

return true

}

这样就可以了。

在命令行输入:

Java(javac) XXX的时候,java.exe(javac.exe)的工作就是找到合适的JRE来执行类文件。java.exe(javac.exe)依照如下逻辑来寻找JRE:

自己的目录下有没有JRE目录(这么说并不是非常精确,原因请详见JDK源代码,在此不作特别说明); 父目录下的JRE子目录; 查询Windows Registry (HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment);

所以,java.exe(javac.exe)的执行结果和“您计算机里面哪一个java.exe被执行,然后哪一套JRE被拿来执行java应用程序”有莫大的关系。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8041003.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存