重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

java基础源代码分析 简述java的源代码文件包含哪几个部分?顺序是什么?

Java分析以下源代码,并在表格中填写分析过程

1,0,进弯枯返入循环初始值为1

创新互联成立与2013年,是专业互联网技术服务公司,拥有项目成都网站建设、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元昌江黎族做网站,已为上家服务,为昌江黎族各地企业和个人服务,联系电话:028-86922220

2,1,,进入循环初始值为2

3,2,进入循环初始值为3

4,3,进入循环埋饥初始值为4

5,4,跳败乱出循环X=5

JXTA Platform JAVA参考实现源代码分析(2)

引言唯物喊 管道的概念源于Unix 是不同线程之间直接传输数据的基本手段 JDK中java io包中就有管道类 同时 管道在JXTA中是最基本的概念 是对等点之间的数据传输的主要方式 对等管道协议(PBP)明确规范了对等管道的绑定 解析 响应 本文依次剖析集中式(JDK)和对等环境下(JXTA)管道的实现方式 对比分析其异同 然后尝试在JXTA中建立一个虚拟的全双工的管道 本文的目标是通过对不同环境下管道的实现方式对比分析 来理解为什么JXTA采用管道作为基本的数据传输手段 管道的形象化描述 一个生活中的情景 现在有两个地区A B A是石油生产区 B是石油消费区 现在B地区需要消费A地区的石油 当然可以通过海运 空运获得 然而最通常的方式是架设输油管道 如图所示   引言 管道的概念源于Unix 是不同线程之间直接传输数据的基本手段 JDK中java io包中就有管道类 同时 管道在JXTA中是最基本的概念 是对等点之间的数据传输的主要方式 对等管道协议(PBP)明确规范了对等管道的绑定 解析 响应 本文依次剖析集中式(JDK)和对等环境下(JXTA)管道的实现方式 对比分析其异同 然后尝试在JXTA中建立一个虚拟的全双工的管道 本文的目标是通过对不同环境下管道的实现方式对比分析 来理解为什么JXTA采用管道作为基本的数据传输手段 管道的形象化描述 一个生活中的情景 现在有两个地区A B A是石油生产区 B是石油消费区 现在B地区需要消费A地区的石油 当然可以通过海运 空运获得 然而最通常的方式是架设输油管道 如图所示 java中流的概念和管道的概念都可以通过此案例阐述 A与B之间连接的就是管道 负责将A的石油向B输出 A向管道输出数据(output) B从管道输入数据(input) 可以这样理解 管道是A的输出对象 是B的数据源 这里就产生了三个类 输出流A 输入流B 管道 输入流B负责如何获取数据(read 操作) 输出流A负责如何消费数据(write操作) 管道负责连接它们(connect 操作) 其实 在实现时 管道类分解为管道口 管道出口 由入口出口负责连接 在复杂的网络环境中 这种连接方式可以有专门的网络协议负责(例如 JXTA中的PBP 全称Pipe Bind Protocol) 由以上描述 我们可以清楚知道最原始的管道就是单向的 文章后面介绍的双向管道 是用两个单向管道虚拟的 而非真实的连接方式 不难发现管道最关键的问题是如何协调输出(A)与输入(B) 这在不同的网络环境会遇到不同的问题 最简单的是同一JVM下的不同过程(线程或任务)之间用同步方式传递数据 而对等环境下 如何去发现对方就是一个很现实的问指野题 这仅仅只是问题的其中之一 下面的章节会依次分析 集中式环境下管道的实现 问题的描述 A与B是在同一JVM中 A B有一方能够发现另一方的存在 A将数据发往B方 A发送数据与B接收数据是相互独立的 现在回到问题的最初 为什么要使用管道?A只管发送 B只管接受 那么数据在哪儿呢?经过蚂绝下面的分析 就会明白管道把管理数据缓冲区的重任交给了他自己 A B均是围绕这个缓冲区来启停线程的 显然这才是问题的本质 JDK中 类PipeInputStream(即前面所述的B)与PipeOutputStream(即前面所述的的A)可以很好的解决这一问题 首先给出类图如下   下面是将类PipeOutputStream的connect方法代码简化后给予注释 public synchronized void connect(PipedInputStream snk) throws IOException { sink = snk; //将PipeInputStream的实例作为PipeOutputStream的一个属性 以便调用 snk in = ;//缓冲区的输入位置 表示缓冲区为空 snk out = ;//缓冲区的输出位置nnected = true;}连接以后 PipeOutputStream的write操作直接调用sink receive(b);这样 对缓冲区buffer的维护 就变成了read()和receive()操作之间的线程同步 JDK对缓冲区的处理非常巧妙 采用了循环列表 它用缓冲区的标志位的变化来代替数据的移动 类似于生活中的时钟把线性的时间规范为 小时来表示 这不属于本文的论述范围 就不继续分析了 read操作 正常情况下 从out位置读取数据 缓冲区空时进入等待状态 以轮询的方式( 秒间隔)来自我释放 receive操作 正常情况下 向in位置写入数据 缓冲区满时进入等待状态 同样 以轮询的方式( 秒间隔)来自我释放 JXTA对等管道的实现 通过对JDK的分析 我们可以了解到在集中式环境下 管道的架设方案是比较简单的 在对等环境下(分布式环境下也类似) 出于同样的目标 遇到的问题却在急剧的扩大 例如 管道入口和出口之间如何相互发现?数据如何保证在不同的环境下传送?甚至 对管道本身的概念发生质疑 一定是单入口 单出口吗?JXTA规范中 管道是在端点之上的服务或应用之间发送和接收信息的虚拟连接通道 管道提供在对等端点传输之上的网络抽象 管道有点到点和广播两种通信模式 JXTA是通过管道广告来唯一标示管道的 输出管道要找到与其广告相同的输入管道才能发送数据 广告内容如下!DOCTYPE jxta:PipeAdvertisementjxta:PipeAdvertisement xmlns:jxta= ; Idurn:jxta:uuid A E AE ABBE EF CBE /Id Type JxtaUnicast /Type Name PipeExample /Name/jxta:PipeAdvertisement如果您需要对JXTA管道有实例化的概念 请参考Sing Li的使p p能进行交互操作 Jxta命令shell 这篇文章有部分内容专门介绍了如何在通过shell使用管道 本文主要是从编程的视角去看管道是如何实现的 客户视角Project JXTA : Java Programmer s Guide Chapter 有个例子阐述如何去在对等点之间发送信息 读者可以到下载源码 现在从客户视角简要的分析它的传送原理 要深入的了解可以看下一节的系统视角分析 该例中 有两个对等点 并且构建了两个不同的类 一个负责接收(Pipelistener) 一个负责发送(PipeExample) 具体的接收次序可以参考时序图  educity cn/img_ / / / gif 类Pipelistener实现了接口PipeMsgListener 类PipeExample实现了接口OutputPipeListener 由时序图(这是两个JVM中的类 所以时序符号是独立标示的)可以清晰的获知 各个对等点的前 步是相互独立的 各自的第 步 采用回调的方式建立输入和输出管道 一旦对等系统探测到对方的存在 就分别触发各自的事件发送或接收消息 显然JXTA中管道是异步的 调试该例程时 注意先建立输入管道 然后建立输出管道 因为 输出管道在一定的时间和次数内探测不到输入管道的存在 就会主动放弃 否则 容易让网络系统在这些无休止的探测中瘫痪 系统视角从上面的例程中 可以了解对等管道的创建方法 以及数据流程 但是不能明确对等系统是如何去实现的 JXTA中管道的实现比在JDK中实现要复杂得多 具体的技术标准可以参考对等管道绑定协议(PBP) 此协议规范了JXTA中管道的概念 但并没有涉及到如何去实现 这同样是所有JXTA协议的特征 它们的目标是阐述what it is 而把how to do it留给开发者 这样有利于增强系统的开放性 其中Java参考实现 就是该协议实现的一个案例 以下将具体分析 首先看管道实现的类图(以单播为例)  educity cn/img_ / / / gif 关键的类  InputPipeImpl 输入管道的实现类 NonBlockingOutputPipe 输出管道的实现类 PipeServiceImpl 管道服务的实现类 负责创建输入输出管道 PipeResolver 提供管道绑定的解析服务 通过客户视角的分析 可以得知系统外部是通过PipeServiceImpl来获取输入输出管道 那么消息是如何在对等系统中通过管道过滤和传递的? 从程序实现的角度 涉及到太多的技术细节 JXTA的参考实现中有着庞杂的监听系统 本文尝试用一个案例从两个层次去解析这个问题 两个层次分别是消息的具体形式 服务和端点协议的具体分发策略 很显然 这里我们把注意力放在了管道的架构路径上 而把如何去架构放在了一边 我想它们是有先后关系的 并且距离并不遥远 案例描述 现在假设有两个对等点alas 和sisal 在一个局域网内 按照客户视角那一节的例程sisal先建立输入管道 alas建立输出管道 由于同一网内可以用广播的方式发送查询信息 可以不设rendevous 并且路由是两点间的 消息传递过程得到了一定的简化 案例分析 以上案例中 从输入输出管道的建立到完成对接并传输数据总共有 个步骤 sisal建立输入管道 alasl建立输出管道 需要查找输入管道 通过广播向网络发出管道查询消息 sisal获得alas的管道查询消息 通过单播向sisal发出响应表示 alas获得sisal的响应 通过单播向alas发出数据 sisal获得数据 lishixinzhi/Article/program/Java/gj/201311/27397

求解答以下的java源代码,详细点,说明这个程序的设计思路,还有比如运用了多线程的话运用了多线程的什么

import java.awt.*;

import java.awt.event.*;

import java.util.Random;

import javax.swing.Timer;

public class PinBall

{

private final int TABLE_WIDTH = 300;//桌面宽度

private final int TABLE_HEIGHT = 400;//桌面高度

private final int RACKET_Y = 340;//球拍的垂直位置

private final int RACKET_HEIGHT = 20;//球拍高度

private final int RACKET_WIDTH = 60;//球拍宽度

private final int BALL_SIZE = 16;//球的大小

private Frame f = new Frame("弹球游戏");//实例化一个窗口

Random rand = new Random();//实例化一个随机数生成器

private int ySpeed = 10;//小球的唯胡稿纵向运动数度、

private double xyRate = rand.nextDouble() - 0.5;//返回一个-0.5到0.5之间的比率用控制小球运动方向

private int xSpeed = (int)(ySpeed*xyRate*2);//这个横向速度在-10到10之间,产生左右摆动运动效果

private int ballX = rand.nextInt(200)+20;//小球开始的横坐标位置,200表示产生0到100之间的随机数

private int ballY = rand.nextInt(10)+20;//小球开始的纵坐标位置

private int racketX = rand.nextInt(200);//球拍开始时的横坐标位置

private MyCanvas tableArea = new MyCanvas();//实力化一个画布工具,集成Canvas类

private String shape = "";//保存需要绘制图形的字符串属性

Timer timer;/指孝/声明一个时间变量

private boolean isLose = false;//表示游戏是否结束

public void init()

{

tableArea.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));//定义画布大小

f.add(tableArea);//添加画布到窗口

KeyAdapter keyProcessor = new KeyAdapter()//实例化一个键盘监听事件适配器

{

public void keyPressed(KeyEvent ke)//重写适配器里面的按下某键盘方法

{

if(ke.getKeyCode()==KeyEvent.VK_LEFT)//按下键盘左键时

{

if(racketX 0)//球拍左边框不能出画布的左边框

racketX -=10;//按一左键次向左移动10个像素

}

if(ke.getKeyCode()==KeyEvent.VK_RIGHT)//按下键盘右键时

{

if(racketX TABLE_WIDTH - RACKET_WIDTH)//球拍右边框不能出画做尘布的右边框

racketX +=10;//按一次右键移动向右移动10个像素

}

}

};

f.addKeyListener(keyProcessor);//给窗口添加键盘监听器

tableArea.addKeyListener(keyProcessor);//给画布添加键盘监听器

ActionListener taskPerformer = new ActionListener()//这里是实例化了一个监听接口,这个接口里面只有一个方法

{

public void actionPerformed(ActionEvent evt)//重写这个接口里面的方法,判断小球的位置

{

if(ballX=0 || ballX=TABLE_WIDTH-BALL_SIZE)//保证小球横向上在画布之内运动

{

xSpeed = -xSpeed;//触发反方向运动

}

if(ballY=RACKET_Y-BALL_SIZE(ballXracketX||ballXracketX+RACKET_WIDTH))//出了球拍的可击打范围

{

timer.stop();//停止对监听器的触发

isLose=true;//将标志isLose变量置为true

tableArea.repaint();//调用画布的重绘方法

}

else if(ballY=0||(ballY=RACKET_Y-BALL_SIZEballYracketXballX=racketX+RACKET_WIDTH))//小球在球拍之内,而其到达球拍的高度

{

ySpeed=-ySpeed;//上下方向改变,小球反弹

}

ballY+=ySpeed;//小球的坐标在纵向上增加

ballX+=xSpeed;//小球的坐标在横向上的增加

tableArea.repaint();//调用画布的重绘方法3

}

};

timer = new Timer(100,taskPerformer);//每隔0.1秒运行一次监听器

timer.start();//计时器开始运行

f.addWindowListener(new MyListener());//关闭窗口事件

f.pack();//设置窗口最佳大小

f.setVisible(true);//显示窗口

}

class MyListener extends WindowAdapter//关闭窗口的类

{

public void windowClosing(WindowEvent e)

{

System.exit(0);

}

}

public static void main(String[] args)//程序入口

{

new PinBall().init();//调用PinBall类里面的init()方法

}

class MyCanvas extends Canvas//建一个集成Canvas类的类

{

public void paint(Graphics g)//重写父类的绘图方法

{

if(isLose)//如果isLose为真,则在画布里打印“游戏已结束”

{

g.setColor(new Color(255,0,0));//当前颜色

g.setFont(new Font("黑体",Font.BOLD,30));//字体名称,样式,大小

g.drawString("游戏已结束!",50,200);//按坐标绘制文字图形

}

else//负责

{

g.setColor(new Color(240,240,80));//当前颜色

g.fillOval(ballX,ballY,BALL_SIZE,BALL_SIZE);//填充颜色,根据坐标和长宽填充圆形

g.setColor(new Color(80,80,200));//当前颜色

g.fillRect(racketX,RACKET_Y,RACKET_WIDTH,RACKET_HEIGHT);//填充颜色,根据坐标和长宽填充矩形

}

}

}

}

java源代码分析----jvm.dll装载过程

简述 众所周知java exe是java class文件的执行程序 但实际上java exe程序只是一个执行的外壳 它会装载jvm dll(windows下 以下皆以windows平台为例 linux下和solaris下其实类似 为 libjvm so) 这个动态连接库才是java虚拟机的实际操作亏察磨处理所在 本文探究java exe程序是如何查找和装载jvm dll动态库 并调用它进行class文件执行处理的 源代码 本文分析之代码 《JavaTM SDK Standard Edition v fcsCommunity Source Release》 可从sun官方网站下载 主要分析的源代码为 j se\src\share\bin\java cj se\src\windows\bin\java_md c java c是什么东西 java程序 源代码所谓 java程序 包括jdk中的java exe\javac exe\javadoc exe java c源代码中通过JAVA_ARGS宏来控制生成的代码 如果该宏没定义则编译文件控制生成java exe否则编译文件控制生成其他的 java程序 比如 j se\make\java\javac\Makefile(这是javac编译文件)中 $(CD) / /sun/javac ; $(MAKE) $@ RELEASE=$(RELEASE) FULL_VERSION=$(FULL_VERSION)j se\make\sun\javac\javac\Makefile(由上面Makefile文件调用)中 JAVA_ARGS = { \ J ms m\ \ sun tools javac Main\ } 则由同一份java c代码生成的javac exe程序就会直接调用java类方法 sun tools javac Main 这样使其执行起来就像是直接运行的一个exe文件 而未定义JAVA_ARGS的java exe程序则会调用传递过来参数中的类方法 从java c的main入口函数说起 main()函数中前面一段为重新分配参数指针的处理 然后调用函数 CreateExecutionEnvironment 该函数主要查找java运行环境的目录 和jvm dll这个虚拟机核心动态连接库文件路径所在 根据操作系统不同 该函数有不同实现版本 但大体处理逻辑相同 我们看看windows平台该函数的处理没厅(j se\src\windows\bin\java_md c) CreateExecutionEnvironment函数主要分为三步处理 a 查找jre路径 b 装载jvm cfg中指定的虚拟机动态连接库(jvm dll)参数 c 取jvm dll文件路径 实现 a 查找jre路径是通过java_md c中函数 GetJREPath实现的 该函数首先调用GetApplicationHome函数 GetApplicationHome函数调用windowsAPI函数GetModuleFileName取java exe程序的绝对路径 以我的jdk安装路径为例 为 D:\java\j sdk _ \bin\java exe 然后去掉文件名取绝对路径为 D:\java\j sdk _ \bin 之后会在去掉最后一级目录 现在绝对路径为 D:\java\j sdk _ 然后GetJREPath函数继续判断刚刚取的路径+\bin\java dll组合成的这个java dll文件是否存在 如果存在则 D:\java\j sdk _ 为JRE路径 否则判断取得的 D:\java\j sdk _ 路径+\jre\bin\java dll文件是否存在 存在则 D:\java\j sdk _ \jre 为JRE路径 如果上销斗面两种情况都不存在 则从注册表中去查找(参见函数GetPublicJREHome) 函数 GetPublicJREHome先查找 HKEY_LOCAL_MACHINE\Sofare\JavaSoft\Java Runtime Environment\CurrentVersion键值 当前JRE版本号 判断 当前JRE版本号 是否为 做为版本号 如果是则取HKEY_LOCAL_MACHINE\Sofare\JavaSoft\Java Runtime Environment\ 当前JRE版本号 \JavaHome的路径所在为JRE路径 我的JDK返回的JRE路径为 D:\java\j sdk _ \jre b 装载jvm cfg虚拟机动态连接库配置文件是通过java c中函数:ReadKnownVMs实现的 该函数首先组合jvm cfg文件的绝对路径 JRE路径+\lib+\ARCH(CPU构架)+\jvm cfgARCH(CPU构架)的判断是通过java_md c中GetArch函数判断的 该函数中windows平台只有两种情况 WIN 的 ia 其他情况都为 i 我的为i 所以jvm cfg文件绝对路径为 D:\java\j sdk _ \jre\lib\i \jvm cfg 文件内容如下 ## @(#)jvm cfg  / / # # Copyright Sun Microsystems Inc All rights reserved # SUN PROPRIETARY/CONFIDENTIAL Use is subject to license terms # # ### List of JVMs that can be used as an option to java javac etc # Order is important first in this list is the default JVM # NOTE that this both this file and its format are UNSUPPORTED and# WILL GO AWAY in a future release ## You may also select a JVM in an arbitrary location with the# XXaltjvm=jvm_dir option but that too is unsupported# and may not be available in a future release # client KNOWN server KNOWN hotspot ALIASED_TO client classic WARN native ERROR green ERROR(如果细心的话 我们会发现在JDK目录中我的为 D:\java\j sdk _ \jre\bin\client 和 D:\java\j sdk _ \jre\bin\server 两个目录下都存在jvm dll文件 而java正是通过jvm cfg配置文件来管理这些不同版本的jvm dll的 )ReadKnownVMs函数会将该文件中的配置内容读入到一个JVM配置结构的全局变量中 该函数首先跳过注释(以 # 开始的行) 然后读取以 开始的行指定的jvm参数 每一行为一个jvm信息 第一部分为jvm虚拟机名称 第二部分为配置参数 比如行 client KNOWN 则 client 为虚拟机名称 而 KNOWN 为配置类型参数 KNOWN 表示该虚拟机的jvm dll存在 而 ALIASED_TO 表示为另一个jvm dll的别名 WARN 表示该虚拟机的jvm dll不存在但运行时会用其他存在的jvm dll替代执行 而 ERROR 同样表示该类虚拟机的jvm dll不存在且运行时不会找存在的jvm dll替代而直接抛出错误信息 在运行java程序时指定使用那个虚拟机的判断是由java c中函数 CheckJvmType判断 该函数会检查java运行参数中是否有指定jvm的参数 然后从ReadKnownVMs函数读取的jvm cfg数据结构中去查找 从而指定不同的jvm类型(最终导致装载不同jvm dll) 有两种方法可以指定jvm类型 一种按照jvm cfg文件中的jvm名称指定 第二种方法是直接指定 它们执行的方法分别是 java Jjvm cfg中jvm名称 java XXaltjvm=jvm类型名称 或 java J XXaltjvm=jvm类型名称 如果是第一种参数传递方式 CheckJvmType函数会取参数 J 后面的jvm名称 然后从已知的jvm配置参数中查找如果找到同名的则去掉该jvm名称前的 直接返回该值 而第二种方法 会直接返回 XXaltjvm= 或 J XXaltjvm= 后面的jvm类型名称 如果在运行java时未指定上面两种方法中的任一一种参数 CheckJvmType会取配置文件中第一个配置中的jvm名称 去掉名称前面的 返回该值 CheckJvmType函数的这个返回值会在下面的函数中汇同jre路径组合成jvm dll的绝对路径 比如 如果在运行java程序时使用 java J client test 则ReadKnownVMs会读取参数 client 然后查找jvm cfg读入的参数中是否有jvm名称为 client 的 如果有则去掉jvm名称前的 直接返回 client 而如果在运行java程序时使用如下参数 java XXaltjvm=D:\java\j sdk _ \jre\bin\client test 则ReadKnownVMs会直接返回 D:\java\j sdk _ \jre\bin\client 如果不带上面参数执行如 java test 因为在jvm cfg配置文件中第一个存在的jvm为 client 所以函数ReadKnownVMs也会去掉jvm名称前的 返回 client 其实这三中情况都是使用的 D:\java\j sdk _ \jre\bin\client\jvm dll 这个jvm动态连接库处理test这个class的 见下面GetJVMPath函数 c 取jvm dll文件路径是通过java_md c中函数 GetJVMPath实现的 由上面两步我们已经获得了JRE路径和jvm的类型字符串 GetJVMPath函数判断CheckJvmType返回的jvm类型字符串中是否包含了 \ 或 / 如果包含则以该jvm类型字符串+\jvm dll作为JVM的全路径 否则以JRE路径+\bin+\jvm类型字符串+\jvm dll作为JVM的全路径 看看上面的例子 第一种情况 java J client test jvm dll路径为 JRE路径+\bin+\jvm类型字符串+\jvm dll 按照我的JDK路径则为 D:\java\j sdk _ \jre + \bin + \client + \jvm dll 第二种情况 java XXaltjvm=D:\java\j sdk _ \jre\bin\client test 路径为 jvm类型字符串+\jvm dll即为 D:\java\j sdk _ \jre\bin\client + \jvm dll 第三种情况 java test 为 D:\java\j sdk _ \jre + \bin + \client + \jvm dll 与情况一相同 所以这三种情况都是调用的jvm动态连接库 D:\javaj sdk _ \jre\bin\client\jvm dll 处理test类的 我们来进一步验证一下 打开cmd控制台 设置java装载调试E:\work\java_researchset _JAVA_LAUNCHER_DEBUG= 情况一E:\work\java_researchjava J client test ScanDirectory _JAVA_LAUNCHER_DEBUG lishixinzhi/Article/program/Java/hx/201311/26750


文章名称:java基础源代码分析 简述java的源代码文件包含哪几个部分?顺序是什么?
URL链接:http://cqcxhl.com/article/ddpsdph.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP