如何跟踪java代码的java 执行字符串代码

Java编程入门(1.1):读取-执行周期:机器语言 - ImportNew
读取-执行周期:机器语言
计算机是一个由不同组件构成的复杂系统。但其心脏,或称为大脑,是进行实际计算的组件,我们称其为中央处理器(Central Processing Unit,CPU)。在现代的台式计算机中,CPU是一块约一平方英寸大小的芯片,它的工作是执行程序。
一个程序仅仅是一些无歧义的、由计算机机械地执行的指令。计算机能够执行那些由一种叫机器语言(Machine Language)所编写的指令,并且每种类型的计算机都有其自己的机器语言。因此,只要你的程序由相应的机器语言来表达,计算机便能直接执行它。(如果用其他种类的编程语言编写程序,并将其转换成相应的机器语言,你的程序同样可以执行。)
当CPU执行一个程序的时候,这个程序存储于主存(Main Memory,也可称为Random Access Memory,RAM)之中。除了程序本身,主存中也存有该程序使用或处理的数据。主存由一系列按顺序编号的存储单元(Location)构成,这些单元的编号即为它们各自的主存地址。主存地址提供了一种从存储于主存中的数以百万计的信息中选出特定信息的方法。当CPU需要从特定的存储单元访问程序的指令或者数据,它就会让单元的地址通过一个信号发送给主存。接着,主存会将指定单元所包含的信息返回给CPU。同样,CPU也能通过指定需要存储到主存的信息以及存储它的单元地址,将信息存入主存中。
从机器语言层面看来,CPU的操作是相当简单的(尽管其中的细节相当的复杂)。当执行一个以一系列机器语言指令的形式存储于主存之中的程序时,CPU总是在重复地从主存中提取(Fetch)一条指令,然后执行(Execute)它。这个过程——读取一个指令然后执行它,再读取另一条并执行,如此往复——称作读取-执行周期(fetch-and-execute cycle)。这便是CPU全部的工作,不过也有一个例外情况,我将在下一节说明。
对你来说,了解读取-执行周期的细节并不是非常重要,但是有一些基础知识你需要知晓:CPU包含几个内置寄存器,每个寄存器是一个能够保存一个数字或者一条机器指令的小型的内存单元。CPU用其中一个称为程序计数器(Program Counter,PC)的寄存器来保持对正在执行的程序指令执行位置的跟踪。PC仅保存CPU将要执行的下一条指令的主存地址。在每一个读取-执行周期开始前,CPU将确保PC知道CPU将要提取哪一条指令。在周期的过程当中,PC中的数值将更新为下一个循环中CPU所需执行的指令的主存地址。(下一循环的指令往往就是同一程序中紧挨当前指令的下一条。)
计算机机械地执行机器语言程序——即不会去理解或思考它们,采用这种方式与计算机的物理组成方式有关。要理解这个概念可能有些困难,我们需要知道:一台计算机由数百万个叫晶体管(Transistor)的微小开关(Switch)构成,这些开关用某种特定的方式集成在一起,并使其具有如下属性:一个开关开闭产生的输出信号能够改变另一个开关的开闭状态。当计算机进行计算时,这些开关按照连接方式及正在执行的程序共同决定的模式,互相控制闭合与断开。
机器语言指令以二进制数的方式表示。一个二进制数仅能为0或1。每个0或1称为1位(Bit)。所以,一条机器语言的指令就是一个由一些0和1构成的序列。每个特定的序列编码了一些特定的指令。计算机操作的数据也是一些二进制数编码而成。在现代计算机中,主存中的每一个存储单元储存1字节(Byte)空间的信息,每字节代表一个8位的序列。(一条机器语言指令或者一段数据通常占用多个字节空间,并且保存在连续的主存存储单元中。)
计算机可以通过二进制数直接工作,是因为开关能够轻易地表达二进制数值——闭合开关即表示1、断开开关即表示0。机器语言指令以控制某些开关闭合或断开的模式存储于主存之中。当一条机器语言指令被读入CPU中,将会发生的便是指定的那些开关按照指令所编码的模式闭合或断开。CPU可以轻松地响应这种由指令编码的模式,因为构成它的开关都是连接在一起的。
所以,对于计算机是如何工作的问题,你应该有了以下的认识:主存存储着编码成二进制数的机器语言程序和数据。CPU机械地从主存中一条一条地读取并执行机器语言指令,而不去思考或者理解它们做了什么。CPU所执行的程序必须是功能完备且无歧义的,因为除了按照程序的内容去执行它以外,CPU什么都不管。以下是一张能初步了解计算机的原理图:
原文链接:
- 译文链接: [ 转载请保留原文出处、译者和译文链接。]
关于作者:
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:ImportNew.
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2018 ImportNewjava跟踪执行的sql语句示例分享
转载 &发布时间:日 10:34:57 & 作者:
这篇文章主要介绍了java跟踪执行的sql语句示例分享,需要的朋友可以参考下
代码: 代码如下:package com.lwj.test.
import java.lang.reflect.InvocationHimport java.lang.reflect.InvocationTargetEimport java.lang.reflect.Mimport java.lang.reflect.Pimport java.sql.Cimport java.sql.SQLE
public class DBManager {&&& private final static ThreadLocal&Connection& conns = new ThreadLocal&Connection&();&&& private static boolean show_sql =&& &&& public final static Connection getConnection() throws SQLException {&& &&&&&&& Connection conn = (Connection) conns.get();&& &&&&&&& if(conn ==null || conn.isClosed()){&& &&&&&&&&&&& // 这里使用我定义的一个简单的 ConnectionProvider 替代 dataSource 获取Connection&& &&&&&&&&&&& conn = ConnectionProvider.getConnection();&& &&&&&&&&&&& conns.set(conn);&& &&&&&&& }&& &&&&&&& return (show_sql && !Proxy.isProxyClass(conn.getClass()))?&& &&&&&&&&&&&&&&&&&&&&& new _DebugConnection(conn).getConnection():&& &&& }&& &&& /**& &&&& * 关闭连接& &&&& */& &&& public final static void closeConnection() {&& &&&&&&& Connection conn = (Connection) conns.get();&& &&&&&&& try {&& &&&&&&&&&&& if(conn != null && !conn.isClosed()){&& &&&&&&&&&&&&&&& conn.setAutoCommit(true);&& &&&&&&&&&&&&&&& conn.close();&& &&&&&&&&&&& }&& &&&&&&& } catch (SQLException e) {&& &&&&&&& }&& &&&&&&& conns.set(null);&& &&& }&& &&& /**& &&&& * 用于跟踪执行的SQL语句& &&&& */& &&& static class _DebugConnection implements InvocationHandler {&& &&&&&&& private Connection conn =&&&&&&& public _DebugConnection(Connection conn) {&& &&&&&&&&&&& this.conn =&&&&&&& }&&&&&&& public Connection getConnection() {&& &&&&&&&&&&& return (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(),new Class[]{Connection.class}, this);&&&&&&& }&&&&&&& public Object invoke(Object proxy, Method m, Object[] args) throws Throwable&&& &&&&&&& {&& &&&&&&&&&&& try&&& &&&&&&&&&&& {&& &&&&&&&&&&&&&&& String method = m.getName();&& &&&&&&&&&&&&&&& if("prepareStatement".equals(method) || "createStatement".equals(method))&& &&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&& System.out.println(method);&&&&&&&&&&&&&&&&&&& System.out.println(args[0]);&&&&&&&&&&&&&&& }&& &&&&&&&&&&&&&&& return m.invoke(conn, args); &&&&&&&&&&& } catch (InvocationTargetException e) {&& &&&&&&&&&&&&&&& throw e.getTargetException();&& &&&&&&&&&&& }&& &&&&&&& }&& &&& } }
package com.lwj.test.
import java.sql.Cimport java.sql.DriverM
public class ConnectionProvider {&public static Connection getConnection()&& &&& {& Connection connection =&&&&&& try{&& &&&&&&&&&& Class.forName("oracle.jdbc.OracleDriver").newInstance();&& &&&&&&&&&& connection = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.101:1521:orcl", "scott", "tiger");&&&&&& }catch(Exception e){&& &&&&&& }&&&&&&&&& }}
package com.lwj.test.
import java.sql.Cimport java.sql.PreparedSimport java.sql.ResultSimport java.sql.SQLEimport java.sql.S
public class TestMain {&public static void main( String[] args )&& &&& {&& &&&&&&&&&&& Connection conn =&& &&&&&&&&&&& Statement stmt =&&&&&&&&&&& PreparedStatement pstmt =&&&&&&&&&&& try& &&&&&&&&&&& {&& &&&&&&&&&&&&&&& conn = DBManager.getConnection();&&&&&&&&&&&&&&& stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);&& &&&&&&&&&&&&&&& stmt.executeUpdate( "insert into test1(id,name,card,age,address) values(9,'liuwj','8777',24,'hubeitianmen')" );&& &&&&&&&&&&&&&&& /*pstmt = conn.prepareStatement( "insert into test1(id,name,card,age,address) values(?,?,?,?,?)"); &&&&&&&&&&&&&&& pstmt.setString(1, "10");&&&&&&&&&&&&&&& pstmt.setString(2, "liuwj2");&&&&&&&&&&&&&&& pstmt.setString(3, "8777");&&&&&&&&&&&&&&& pstmt.setString(4, "22");&&&&&&&&&&&&&&& pstmt.setString(5, "123456");&&&&&&&&&&&&&&& pstmt.execute();*/&&&&&&&&&&& }catch(SQLException e){&& &&&&&&&&&&& }finally{&& &&&&&&&&&&&&&&&& try{&& &&&&&&&&&&&&&&&&&& if( pstmt != null ){&& &&&&&&&&&&&&&&&&&&& pstmt.close();&& &&&&&&&&&&&&&&&&&&& pstmt =&&&&&& &&&&&&&&&&&&&&&&&& }&& &&&&&&&&&&&&&&&& }catch(SQLException e){&& &&&&&&&&&&&&&&&& }&&& &&&&&&&&&&&&&&&& DBManager.closeConnection();&& &&&&&&&&&&& }&&&& &&& }}
论坛上看到用下列语句: 代码如下:pstmt = conn.prepareStatement( "insert into test1(id,name,card,age,address) values(?,?,?,?,?)"); pstmt.setString(1, "10");pstmt.setString(2, "liuwj2");pstmt.setString(3, "8777");pstmt.setString(4, "22");pstmt.setString(5, "123456");pstmt.execute();
才能打印出sql语句。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具没有更多推荐了,
不良信息举报
举报内容:
5种跟踪Java执行的方法
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!博客分类:
前几日系统流程回调时,一个方法莫名其妙被调用,无法定位调用点。最后打印堆栈调用信息,找到问题点。
具体使用如下:
在需要跟踪的方法中嵌入如下代码(当然AOP是个更好的选择):
Throwable ex = new Throwable();
StackTraceElement[] stackElements = ex.getStackTrace();
if (stackElements != null) {
for (int i = 0; i & stackElements. i++) {
System.out.println(stackElements[i].getClassName());//返回类的完全限定名,该类包含由该堆栈跟踪元素所表示的执行点。
System.out.println(stackElements[i].getFileName());//返回源文件名,该文件包含由该堆栈跟踪元素所表示的执行点。
System.out.println(stackElements[i].getLineNumber());//返回源行的行号,该行包含由该堆栈该跟踪元素所表示的执行点。
System.out.println(stackElements[i].getMethodName());//返回方法名,此方法包含由该堆栈跟踪元素所表示的执行点。
System.out.println("-------------第"+i+"级调用-------------------");
示例结果如下:
-------------第0级调用-------------------
cn.sccl.Test
-------------第1级调用-------------------
浏览: 398332 次
来自: 成都
很好的办法,学习了。
哦,多谢分享
谢谢了,找了好久才找到
CATALINA_OPTS=&-Djava.libr ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 java代码执行顺序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信