??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
在applet上叠加层?U方?br />
W一Q用iframe的方?br />
W二Q用window.createPopup();方式
<div></div>的方式我是没有试成功Q无论如何设|,div都在applet的下面,要是哪位实验成功了,l验也共享一?br />
׃window.createPopup()主要用于创徏右键菜单Q由于其的一些特性,例如在其他地方点?该window.createPopup()对象消失Q所以叠加层方式使用window.createPopup()q不合适,使用iframe制作叠加层的效果更好更好
效果囑֦?br />
演示Q?a >http://www.fruitres.cn/applet.jspQ可以从该演C页直接下蝲js代码Q或者到代码下蝲下?br />
代码下蝲Q?a >http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1084563770&number=0
更多下蝲Q?a >http://www.fruitres.cn/
]]>
在GIS|站上一般都会看C面的滚动条,俗称骨头或是排骨架Q当然这个是WEB方式
如果是应用程序或是Applet该如何制作呢Q其实也不复杂,只是需要灵z运用Swing的特性,下面是一个Application的demo
看似复杂Q其实如果理解了也没有什么神U?br />
下蝲地址Q?a >http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1342916853&number=0
JAVA WEB START演示地址Q?a >http://www.fruitres.cn/useruploadfile/3/1342916853_jnlp.jnlp
更多下蝲Q?a >http://www.fruitres.cn/
]]>
代码演示了基于ArcIMS开发包q行地图开发的基础Ҏ
代码不是单独的可执行c,所以只看private void initMap()Ҏ和public BufferedImage render()Ҏ卛_。MapBoundModel不用q可以理解为等同Envelopecd?br />
在确定以下三个?br />
private String host = "172.17.8.99";
private int port = 5300;
private String servicename = "sde";
讄正确q且调用refresh();Ҏ也没有异常抛出,但是getStream();q回null值得时候,则需要调整AXL文gd<OUTPUT method="stream"/>重新发布Q具体AXL内容h册后下蝲加密附g查看
查看代码直接下蝲demo文g卛_
地址Q?a >http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1257242391&number=0
更多下蝲Q?a >http://www.fruitres.cn
]]>
Geotools是一个开源的Java GIS工具?可利用它来开发符合标准的地理信息pȝ。Geotools提供了OGC(Open Geospatial Consortium)规范的一个实现来作ؓ他们的开?br />
代码演示了基于GeoTools开源包q行地图开发的基础Ҏ
代码不是单独的可执行c,所以只看private void init()Ҏ和public BufferedImage render()Ҏ卛_。MapBoundModel不用q可以理解为等同Envelopecd?br />
直接下蝲demo文g卛_
下蝲地址Q?a >http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=627152979&number=0
更多下蝲Q?a >http://www.fruitres.cn
]]>
JAVA开发的俄罗斯方块源代码Q比较简陋,只支持最基本的功能,不过框架清晰Q感兴趣的可以参?br />
直接下蝲demo文g卛_
JDK1.5
下蝲地址:http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1925709310&number=0
更多下蝲:http://www.fruitres.cn/
]]>
下蝲地址Q?a >http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=994930817&number=0
更多下蝲Q?a >http://www.fruitres.cn
]]>
源代码四个文?在这个DEMO中可以看?br />
如何使用2DlgQ如何把JPanel做ؓL使用Q如何用Canvas替代JPanelQ如何设|?Dlg的线?br />
q个只是针对像入门的新手Q高手就不需要看了,免得扔鸡?br />
下蝲地址 http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1016162856&number=0
更多工具和文档请?http://www.fruitres.cn/
]]>
1.0.4
增加了导发器、存储过E、函数的功能Qƈ且修改了不能导出KEYS全部cd的BUG
1.0.3
增加了导出Sequences、View的功能,q且导出界面默认导出到安装文件夹中的export目录?br />
1.0.2
增加了导出KEYS、INDEX的功?br />
1.0.1
增加了导出完毕以后直接点L开文g夏V打开文g的查看方式,q且支持Linux/Win q_
1.0.0
导出为html文gQ导出完毕后直接查看index.html文g卛_。导出的内容包括各个表的名称索引和注释以及表中各个字D늚明细和注?
下蝲地址 http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=942025602&number=0 下蝲版本1.0.4
更多工具和文档请?http://www.fruitres.cn/
]]>
讄囄的每个象素AlphaQ得图片透明Q核心代码如?br>
private void setAlpha(ByteArrayOutputStream os) {
/**
* 增加试?br> * d囄Q绘制成半透明
*/
try {
ImageIcon imageIcon = new ImageIcon(os.toByteArray());
BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(),imageIcon.getIconHeight()
, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
g2D.drawImage(imageIcon.getImage(), 0, 0,
imageIcon.getImageObserver());
//循环每一个像素点Q改变像素点的Alpha?br> int alpha = 100;
for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
int rgb = bufferedImage.getRGB(j2, j1);
rgb = ( (alpha + 1) << 24) | (rgb & 0x00ffffff);
bufferedImage.setRGB(j2, j1, rgb);
}
}
g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());
//生成囄为PNG
ImageIO.write(bufferedImage, "png", new File(囄路径));
}
catch (Exception e) {
e.printStackTrace();
}
}
String to = GetResource.getXMLValue("mail_to"); //收g?br /> String cc = ""; //抄送h
String bcc = ""; //密送h
String title = GetResource.getXMLValue("mail_title"); //标题
byte[] bytes = null;
try {
bytes = FileIO.readFile(GetResource.getXMLValue("mail_contentpath")); //正文
} catch (IOException ex) {
log.error("",ex);
}
String fromat = GetResource.getXMLValue("mail_fromat");
//获得下蝲需要的key
byte[] bkeydes=null;
try {
bkeydes=FileIO.readFile(GetResource.getXMLValue("附g地址"));
} catch (IOException ex) {
log.error("",ex);
}
try {
Properties props = System.getProperties(); //获得pȝ属?br /> props.put("mail.smtp.host", mailhost); //讄SMTPL
props.put("mail.smtp.auth", "true"); //讄w䆾验证为真Q若n份验证则必须设ؓ?/p>
//获得邮g会话对象
Session session = null;
//需要验?br /> session = Session.getDefaultInstance(props,
new SmtpAuthenticator(user,
password));
//创徏MIME邮g对象
MimeMessage mimeMsg = new MimeMessage(session);
//讄发信?br /> if (strname != null && !strname.equals("")) {
mimeMsg.setFrom(new InternetAddress(from, strname));
} else {
mimeMsg.setFrom(new InternetAddress(from));
}
//讄收信?br /> if (!to.equals("")) {
mimeMsg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
}
//讄抄送h
if (!cc.equals("")) {
mimeMsg.setRecipients(Message.RecipientType.CC,
InternetAddress.parse(cc));
}
//讄暗送h
if (!bcc.equals("")) {
mimeMsg.setRecipients(Message.RecipientType.BCC,
InternetAddress.parse(bcc));
}
//讄邮g主题
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
// mimeMsg.setSubject("=?GB2312?B?" + enc.encode(title.getBytes()) +
// "?=");
mimeMsg.setSubject(title, "GBK");
//讄邮g内容
//mimeMsg.setText(content, "gb2312");
//发送日?br /> mimeMsg.setSentDate(new Date());
/*******************附g begin××××××××××××××××××××××××*/
BodyPart mbp = null; //正文
//MimeBodyPart mbp1 = null; //附g
mbp = new MimeBodyPart();
//讄邮g正文格式Qhtml/textQ?br /> if (fromat.equals("0") || fromat.equals("")) {
//普通格?br /> mbp.setText(new String(bytes,"GBK"));
} else {
//|页格式
mbp.setDataHandler(new DataHandler(new String(bytes,"GBK"),
"text/html;charset=gb2312"));
}
//!!!!注意必须为new MimeMultipart("related"); q样的实例化才能发送html正文昄囄的邮?"related"
//new MimeMultipart(); q样实例化则不能发送html正文昄囄的邮?只可以发送其他的邮g
Multipart mp = new MimeMultipart("related");
if (mbp != null)
mp.addBodyPart(mbp); //正文
//附gkey.des
BodyPart messageBodyPart = new MimeBodyPart();
ByteArrayDataSource fileds = new ByteArrayDataSource(bkeydes,"application/octet-stream");
messageBodyPart.setDataHandler(new DataHandler(fileds));
//解决附g中文问题
//mbp1.setFileName(fileds.getName(),"gb2312");
messageBodyPart.setFileName(MimeUtility.encodeWord("key.des", "GB2312", null));
mp.addBodyPart(messageBodyPart);
//附g 图标
messageBodyPart = new MimeBodyPart();
bytes=FileIO.readFile(GetResource.getXMLValue("img_logo"));
fileds = new ByteArrayDataSource(bytes,"application/octet-stream");
messageBodyPart.setDataHandler(new DataHandler(fileds));
//解决附g中文问题
// messageBodyPart.setFileName("fruitrsource_touming.jpg");
// messageBodyPart.setHeader("Content-ID", "fruitrsource_touming");
messageBodyPart.setFileName("1.jpg");
//!!!!注意q里?<IMG1>" 带有括?而在正文的html里面则是src="cid:IMG1"
messageBodyPart.setHeader("Content-ID", "<IMG1>");
mp.addBodyPart(messageBodyPart);
// d Multipart到Message?br /> mimeMsg.setContent(mp);
mimeMsg.saveChanges();
transport = session.getTransport("smtp");
transport.connect(mailhost, Integer.parseInt(part), user, password);
//发送邮?br /> //transport.send(mimeMsg, mimeMsg.getAllRecipients());
//transport.send(mimeMsg);
transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
//System.out.println("mail send!");
transport.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
class SmtpAuthenticator extends Authenticator {
//SMTPw䆾验证
public SmtpAuthenticator(String username, String password) {
this.username = username;
this.password = password;
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(this.username, this.password);
}
String username = null;
String password = null;
}
private int[][] idata=null;
public ImageData() {
readImageData();
writeImageData();
}
private int[][] readImageData()
{
try {
//imagedata的键值就是一个存储了囑փ像素RGB值得文本文g
RandomAccessFile randomAccessFile = new RandomAccessFile(new File(GetResource.getXMLValue("imagedata")),"r");
long filesize=randomAccessFile.length();
long filepointer=0;
DynArrayInt dynArrayInt=null;
ArrayList arrayList=new ArrayList();
int n1=0;
while(filesize>filepointer)
{
filepointer=randomAccessFile.getFilePointer();
String str1=randomAccessFile.readLine();
if(str1!=null)
{
String[] str2=str1.split(" ");
String[] str3=str2[1].split(",");
dynArrayInt=new DynArrayInt();
for(int i=0;i<str3.length;i++)
{
if(!str3[i].equals(""))
{
int pix = Integer.parseInt(str3[i], 16);
dynArrayInt.addInt(pix);
}
}
if(n1==0)
n1=dynArrayInt.getSize();
arrayList.add(dynArrayInt);
}
}
idata=new int[arrayList.size()][dynArrayInt.getSize()];
for(int i=0;i<idata.length;i++)
{
DynArrayInt dynArrayInt1=(DynArrayInt)arrayList.get(i);
for(int j=0;j<idata[i].length;j++)
{
idata[i][j]=dynArrayInt1.getInt(j);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return idata;
}
private void writeImageData()
{
BufferedImage bufferedImage=new BufferedImage(idata[0].length,idata.length,BufferedImage.TYPE_INT_RGB);
for(int i=0;i<idata.length;i++)
{
for(int j=0;j<idata[i].length;j++)
{
bufferedImage.setRGB(j,i,idata[i][j]);
}
}
Random random=new Random(System.currentTimeMillis());
String ext="jpg";
String filepath = System.getProperty("java.io.tmpdir") + random.nextInt(99999) + "." + ext;
try {
ImageIO.write(bufferedImage, ext, new File(filepath));
System.out.println("文g已经生成Q\lؓ" + filepath);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
ImageData imagedata = new ImageData();
}
}
其中?#8220;GetResource”Q?#8220;DynArrayInt”定义c,GetResource得功能就是解析获取properties文g的内容,DynArrayInt是一个整形动态数l,可以在以前的文章里获?#8220;DynArrayInt”的源代码,所谓的囑փ的像素值就是如下数?br />px1 44525b,44555d,475a61,47585d,44555a,46575c,44575d,43565c,42575e,43585f,445960,435962,435964,425861,425861,41585e,3f555e,3e545f,3d5261,3c5162,3d4f59,3d4f59,3f515b,40525c,40525c,40525c,40525c,3f515b,3f515b,3f4f5a,3f4f5c,40505d,3f515f,3f515f,3d5060,3c4f5f,3b505f,3a4e58,3e525e,3e525e,3d5060,415466,3f5264,405363,405460,41555f,42575d,42575e,43585f,445862,445862,445864,445864,445866,445866,415760,435962,445a63,455b66,455b66,445a67,455b68,485d6c,4c626f,4d636e,4e646f,4d636c,4b616a,51686e,536a70,566d73,5c7378,6f7c7a,7c8987,86908f,8d9796,8e9696,949a9a,969c9c,9ca2a2,a1a3a1,a8aaa8,aeb1ac,b2b5b0,b9bcb7,c5c8c2,cccfc9,ced1c9,d6d9d1,d5d8d3,d7dad5,dadbd5,dcddd7,dcdbd4,ddddd3,e0ddd4,e0ddd4,deddd6,deddd6,deddd6,dfded7,dfded7,e0dfd8,e0dfd8,e0dfd8,e0dfd8,e3dfd9,e3dfd9,e3dfd9,e3dfd9,e4e0da,e4e0da,e4e0da,e5e1db,e5e1db,e2e1da,e2e1da,e3e2db,e3e2db,e4e3dc,e4e3dc,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e6e5de,e6e5de,e6e5de,e6e5de,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e4e1d8,e5e2d9,e5e2d9,e4e1d8,e2dfd6,e3e0d7,e2dfd6,e1ded5,e1ded5,e2dfd6,e2dfd6,e2dfd6,e2dfd6,e1ded5,e1ded5,e1ded5,e1ded5,e1ded5,dedad4,dedad4,dcdbd4,dcdbd4,dbdcd4,dbdcd4,d9dcd4,d9dcd4,dedad4,dedad4,ddd9d3,ddd9d3,dbd7d1,dbd7d1,dcd8d2,dcd8d2,dbd7d1,d5d8d0,d5d8d0,d7d8d0,d7d8d0,d7d6cf,d9d5cf,d9d5cf,d9d5cf,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d5d4cd,d5d4cd,d5d7cc,d5d7cc,d5d7cc,d5d7cc,d4d6cb,d4d6cb,d5d7cc,d5d7cc,d5d7cc,d2d7d0,d2d7d0,d3d6d0,d3d6d0,d4d5cf,d4d5cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d4d3ce,d4d3ce,d4d3ce,d4d3ce,d4d3ce,d0d3cb,d2d3cb,d3d2cb,d6d0cb,d6d0cb,d4d3cc,d3d4cc,d2d5cd,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d0d3cb,d0d3cb,d2d3cb,d2d3cb,d3d2cb,d3d2cb,d5d1cb,d5d1cb,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d1d0c9,d1d0c9,d2d1ca,d2d1ca,d3d2cb,d3d2cb,d3d2cb,d3d2cb
px0 44525b,44575e,465b62,485a5a,455757,46585a,44575b,42555b,41565d,435761,445862,445a63,435966,435964,42595f,42595e,40575c,3f5560,3d5263,3c5066,3a4c58,3b4d59,3d4f5b,3e505a,40525c,40525c,40535a,3f5259,3f5259,3f5057,3f5057,405158,3f5259,3f5259,3d515b,3c505a,3b515c,3a4e5a,3e5260,3e5260,3d5060,415468,3f5266,3f5262,405462,405460,42575d,42575e,43585f,435761,41555f,425662,445864,465a68,465a68,415760,425861,445a63,445a65,445a65,465c69,475d6a,475c6b,44596a,485d6e,4c6373,4d6474,4a616f,4b6472,4b6472,496270,4c6573,5f6c6e,677476,6f7c7e,798587,818a8d,899295,8f969a,91989c,949895,9a9e9b,9ea39d,a1a6a0,a9aea8,aeb3ac,babfb8,c0c5bc,ccd1c8,cfd2cd,d2d5d0,d5d6d0,d7d8d2,dcdbd4,ddddd3,e0ddd4,e0ddd4,deddd6,deddd6,deddd6,dfded7,dfded7,e0dfd8,e0dfd8,e0dfd8,e0dfd8,e3dfd9,e3dfd9,e3dfd9,e3dfd9,e4e0da,e4e0da,e4e0da,e5e1db,e5e1db,e2e1da,e2e1da,e3e2db,e3e2db,e4e3dc,e4e3dc,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e6e5de,e6e5de,e6e5de,e6e5de,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e4e1d8,e4e1d8,e4e1d8,e3e0d7,e2dfd6,e2dfd6,e2dfd6,e1ded5,e1ded5,e2dfd6,e2dfd6,e2dfd6,e2dfd6,e1ded5,e1ded5,e1ded5,e1ded5,e1ded5,ddd9d3,ddd9d3,dbdad3,dbdad3,dadbd3,dadbd3,d8dbd3,d8dbd3,dedad4,dedad4,ddd9d3,ddd9d3,dad6d0,dbd7d1,dcd8d2,dcd8d2,dbd7d1,d5d8d0,d5d8d0,d5d8d0,d7d8d0,d6d7cf,d7d6cf,d7d6cf,d9d5cf,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d5d4cd,d5d4cd,d6d8cd,d6d8cd,d6d8cd,d6d8cd,d4d6cb,d4d6cb,d5d7cc,d5d7cc,d5d7cc,d3d8d1,d3d8d1,d4d7d1,d4d7d1,d4d5cf,d4d5cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d4d3ce,d4d3ce,d4d3ce,d4d3ce,d4d3ce,d0d3cb,d2d3cb,d3d2cb,d6d0cb,d7d1cc,d4d3cc,d4d5cd,d2d5cd,d4d2d1,d4d2d1,d4d2d1,d4d2d1,d4d2d1,d3d1d0,d3d1d0,d3d1d0,d3d1d0,d0d3cb,d0d3cb,d2d3cb,d2d3cb,d3d2cb,d3d2cb,d5d1cb,d5d1cb,d3d2cd,d3d2cd,d3d2cd,d3d2cd,d3d2cd,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d1d0c9,d1d0c9,d2d1ca,d2d1ca,d4d3cc,d4d3cc,d4d3cc,d4d3cc
以上数据表示囑փ有两行像素,每一行有260个像素组成,每个像素的RGB值就?4525b
Java虚拟机的深入研究
作者:刘学?
1 Java技术与Java虚拟?
说vJavaQh们首先想到的是Java~程语言Q然而事实上QJava是一U技术,它由四方面组? Java~程语言、JavacL件格式、Java虚拟机和Java应用E序接口(Java API)。它们的关系如下图所C:
? Java四个斚w的关p?
q行期环境代表着Javaq_Q开发h员编写Java代码(.java文g)Q然后将之编译成字节?.class文g)。最后字节码被装入内存,一旦字节码q入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的{换成机器码执行。从上图也可以看出Javaq_由Java虚拟机和Java应用E序接口搭徏QJava语言则是q入q个q_的通道Q用Java语言~写q编译的E序可以q行在这个^C。这个^台的l构如下图所C:
在Javaq_的结构中, 可以看出QJava虚拟?JVM) 处在核心的位|,是程序与底层操作pȝ和硬件无关的关键。它的下ҎUL接口Q移植接口由两部分组成:适配器和Java操作pȝ, 其中依赖于^台的部分UCؓ适配器;JVM 通过UL接口在具体的q_和操作系l上实现Q在JVM 的上ҎJava的基本类库和扩展cd以及它们的APIQ?利用Java API~写的应用程?application) 和小E序(Java applet) 可以在Q何Javaq_上运行而无需考虑底层q_, 是因ؓ有Java虚拟?JVM)实现了程序与操作pȝ的分,从而实CJava 的^台无x?
那么到底什么是Java虚拟?JVM)呢?通常我们谈论JVMӞ我们的意思可能是Q?
对JVM规范的的抽象说明是一些概늚集合Q它们已l在书《The Java Virtual Machine Specification》(《Java虚拟范》)中被详细地描qCQ对JVM的具体实现要么是软gQ要么是软g和硬件的l合Q它已经被许多生产厂商所实现Qƈ存在于多U^C上;q行JavaE序的Q务由JVM的运行期实例单个承担。在本文中我们所讨论的Java虚拟?JVM)主要针对W三U情况而言。它可以被看成一个想象中的机器,在实际的计算Z通过软g模拟来实玎ͼ有自己想象中的硬Ӟ如处理器、堆栈、寄存器{,q有自己相应的指令系l?
JVM在它的生存周期中有一个明的dQ那是q行JavaE序Q因此当JavaE序启动的时候,׃生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失了。下面我们从JVM的体pȝ构和它的q行q程q两个方面来对它q行比较深入的研I?
2 Java虚拟机的体系l构
刚才已经提到QJVM可以׃同的厂商来实现。由于厂商的不同必然DJVM在实C的一些不同,然而JVMq是可以实现跨^台的Ҏ,q就要归功于设计JVM时的体系l构了?
我们知道Q一个JVM实例的行Z光是它自q事,q涉及到它的子系l、存储区域、数据类型和指oq些部分Q它们描qCJVM的一个抽象的内部体系l构Q其目的不光规定实现JVM时它内部的体pȝ构,更重要的是提供了一U方式,用于严格定义实现时的外部行ؓ。每个JVM都有两种机制Q一个是装蝲h合适名U的c?cL是接?Q叫做类装蝲子系l;另外的一个负责执行包含在已装载的cL接口中的指oQ叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈q五个部分,q几个部分和c装载机制与q行引擎机制一L成的体系l构图ؓQ?
? JVM的体pȝ?
JVM的每个实例都有一个它自己的方法域和一个堆Q运行于JVM内的所有的U程都共享这些区域;当虚拟机装蝲cL件的时候,它解析其中的二进制数据所包含的类信息Qƈ把它们放到方法域中;当程序运行的时候,JVM把程序初始化的所有对象置于堆上;而每个线E创建的时候,都会拥有自己的程序计数器和Java栈,其中E序计数器中的值指向下一条即被执行的指令,U程的Java栈则存储U程调用JavaҎ的状态;本地Ҏ调用的状态被存储在本地方法栈Q该Ҏ栈依赖于具体的实现?
下面分别对这几个部分q行说明?
执行引擎处于JVM的核心位|,在Java虚拟范中Q它的行为是由指令集所军_的。尽对于每条指令,规范很详l地说明了当JVM执行字节码遇到指令时Q它的实现应该做什么,但对于怎么做却a之甚。Java虚拟机支持大U?48个字节码。每个字节码执行一U基本的CPUq算,例如,把一个整数加到寄存器,子程序{Uȝ。Java指o集相当于JavaE序的汇~语a?
Java指o集中的指令包含一个单字节的操作符,用于指定要执行的操作,q有0个或多个操作?提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成?
虚拟机的内层循环的执行过E如? do{ 取一个操作符字节; Ҏ操作W的值执行一个动? }while(E序未结?
׃指opȝ的简单?使得虚拟机执行的q程十分?从而有利于提高执行的效率。指令中操作数的数量和大是由操作符军_的。如果操作数比一个字节大,那么它存储的序是高位字节优先。例?一?6位的参数存放时占用两个字?其gؓ:
W一个字?256+W二个字节字节码?
指o一般只是字节对齐的。指令tableswitch和lookup是例?在这两条指o内部要求强制?字节边界寚w?
对于本地Ҏ接口Q实现JVMq不要求一定要有它的支持,甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可UL性的考虑Q当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情Q需要确保垃圑֛收器不会那些正在被本地Ҏ调用的对象释放掉?
Java的堆是一个运行时数据?cȝ实例(对象)从中分配I间Q它的管理是由垃圑֛收来负责?不给E序员显式释攑֯象的能力。Java不规定具体用的垃圾回收法,可以Ҏpȝ的需求用各U各L法?
JavaҎZ传统语言中的~译后代码或是Unixq程中的正文D늱伹{它保存Ҏ代码(~译后的java代码)和符可。在当前的Java实现?Ҏ代码不包括在垃圾回收堆中,但计划在来的版本中实现。每个类文g包含了一个JavacL一个Java界面的编译后的代码。可以说cL件是Java语言的执行代码文件。ؓ了保证类文g的^台无x?Java虚拟范中对类文g的格式也作了详细的说明。其具体l节请参考Sun公司的Java虚拟范?
Java虚拟机的寄存器用于保存机器的q行状?与微处理器中的某些专用寄存器cM。Java虚拟机的寄存器有四种:
在上qCpȝ构图中,我们所说的是第一U,即程序计数器Q每个线E一旦被创徏拥有了自己的程序计数器。当U程执行JavaҎ的时候,它包含该U程正在被执行的指o的地址。但是若U程执行的是一个本地的ҎQ那么程序计数器的值就不会被定义?
Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区?
局部变量区
每个JavaҎ使用一个固定大的局部变量集。它们按照与vars寄存器的字偏U量来寻址。局部变量都?2位的。长整数和双_ֺ点数占据了两个局部变量的I间,却按照第一个局部变量的索引来寻址?例如,一个具有烦引n的局部变?如果是一个双_ֺ点?那么它实际占据了索引n和n+1所代表的存储空?虚拟范ƈ不要求在局部变量中?4位的值是64位对齐的。虚拟机提供了把局部变量中的D载到操作数栈的指?也提供了把操作数栈中的值写入局部变量的指o?
q行环境?
在运行环境中包含的信息用于动态链?正常的方法返回以及异常捕捉?
动态链?/b>
q行环境包括Ҏ向当前类和当前方法的解释器符可的指?用于支持Ҏ代码的动态链接。方法的class文g代码在引用要调用的方法和要访问的变量时用符受动态链接把W号形式的方法调用翻译成实际Ҏ调用,装蝲必要的类以解释还没有定义的符?q把变量讉K译成与q些变量q行时的存储l构相应的偏Ud址。动态链接方法和变量使得Ҏ中用的其它cȝ变化不会影响到本E序的代码?
正常的方法返?/b>
如果当前Ҏ正常地结束了,在执行了一条具有正类型的q回指o?调用的方法会得到一个返回倹{执行环境在正常q回的情况下用于恢复调用者的寄存?q把调用者的E序计数器增加一个恰当的数?以蟩q已执行q的Ҏ调用指o,然后在调用者的执行环境中l执行下厅R?
异常捕捉
异常情况在Java中被UCError(错误)或Exception(异常),是Throwablecȝ子类,在程序中的原因是:①动态链接错,如无法找到所需的class文g。②q行旉,如对一个空指针的引用。程序用了throw语句?
当异常发生时,Java虚拟机采取如下措?
操作数栈?
机器指o只从操作数栈中取操作?对它们进行操?q把l果q回到栈中。选择栈结构的原因?在只有少量寄存器或非通用寄存器的机器(如Intel486)?也能够高效地模拟虚拟机的行ؓ。操作数栈是32位的。它用于l方法传递参?q从Ҏ接收l果,也用于支持操作的参数,q保存操作的l果。例?iadd指o两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指o压进堆栈的。这两个整数从堆栈弹出、相?q把l果压回到操作数栈中?
每个原始数据cd都有专门的指令对它们q行必须的操作。每个操作数在栈中需要一个存储位|?除了long和double?它们需要两个位|。操作数只能被适用于其cd的操作符所操作。例?压入两个intcd的数,如果把它们当作是一个longcd的数则是非法的。在Sun的虚拟机实现?q个限制由字节码验证器强制实行。但?有少数操?操作Wdupe和swap),用于对运行时数据行操作时是不考虑cd的?
本地Ҏ栈,当一个线E调用本地方法时Q它׃再受到虚拟机关于l构和安全限制方面的U束Q它既可以访问虚拟机的运行期数据区,也可以用本地处理器以及Mcd的栈。例如,本地栈是一个C语言的栈Q那么当CE序调用C函数Ӟ函数的参C某种序被压入栈Q结果则q回l调用函数。在实现Java虚拟机时Q本地方法接口用的是C语言的模型栈Q那么它的本地方法栈的调度与使用则完全与C语言的栈相同?
3 Java虚拟机的q行q程
上面对虚拟机的各个部分进行了比较详细的说明,下面通过一个具体的例子来分析它的运行过E?
虚拟机通过调用某个指定cȝҎmain启动Q传递给main一个字W串数组参数Q指定的类被装载,同时链接该类所使用的其它的cdQƈ且初始化它们。例如对于程序:
class HelloApp { public static void main(String[] args) { System.out.println("Hello World!"); for (int i = 0; i < args.length; i++ ) { System.out.println(args[i]); } } }
~译后在命o行模式下键入Q?java HelloApp run virtual machine
通过调用HelloApp的方法main来启动java虚拟机,传递给main一个包含三个字W串"run"?virtual"?machine"的数l。现在我们略q虚拟机在执行HelloApp时可能采取的步骤?
开始试图执行类HelloApp的mainҎQ发现该cdƈ没有被装载,也就是说虚拟机当前不包含该类的二q制代表Q于是虚拟机使用ClassLoader试图Lq样的二q制代表。如果这个进E失败,则抛Z个异常。类被装载后同时在mainҎ被调用之前,必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶D:验,准备和解析。检验检查被装蝲的主cȝW号和语义,准备则创建类或接口的静态域以及把这些域初始化ؓ标准的默认|解析负责查主cd其它cL接口的符号引用,在这一步它是可选的。类的初始化是对cM声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。整个过E如下:
?Q虚拟机的运行过E?
4 l束?
本文通过对JVM的体pȝ构的深入研究以及一个JavaE序执行时虚拟机的运行过E的详细分析Q意在剖析清楚Java虚拟机的机理?
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author sunfruit
* @version 1.0
*/
public class SdoSelect {
public SdoSelect() {
}
public static void main(String[] args) {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@172.16.75.200:1521:starmap";
String uid = "hmbst";
String psw = "hmbst";
Connection conn = null;
PreparedStatement ps=null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, uid, psw);
JGeometry jGeometry=new JGeometry(41884696,14377039,42884696,14477039,0);
STRUCT obj =jGeometry.store(jGeometry,conn);
String sql = "SELECT * FROM POISDO p WHERE sdo_filter(p.gshape,?,'querytype=window')='TRUE'";
ps = conn.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ps.clearParameters();
ps.setObject(1, obj);
// 插入点地物记?br /> ResultSet rs=ps.executeQuery();
while(rs.next())
{
STRUCT st = (oracle.sql.STRUCT)rs.getObject("gshape");
JGeometry j_geom = JGeometry.load(st);
double[] dou=j_geom.getPoint();
String buff="";
for(int i=0;i<dou.length;i++)
{
buff=buff+String.valueOf((int)dou[i])+" ";
}
System.out.println(buff);
}
}
catch (Exception ex) {
ex.printStackTrace();
}
finally
{
if(conn!=null)
{
try {
conn.close();
}
catch (SQLException ex) {
ex.printStackTrace();
}
}
if(ps!=null)
{
try {
ps.close();
}
catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
}
表POISDO的结构如?br />create table poi (
id INTEGER,
gname VARCHAR2(256),
gshape MDSYS.SDO_GEOMETRY);
}
}
}
表POISDO的结构如?br />create table poi (
id INTEGER,
gname VARCHAR2(256),
gshape MDSYS.SDO_GEOMETRY);
import javax.imageio.ImageIO;
/*******************************************************************
* 该JavaBean可以直接在其他Java应用E序中调用,实现屏幕?拍照"
* This JavaBean is used to snapshot the GUI in a
* Java application! You can embeded
* it in to your java application source code, and us
* it to snapshot the right GUI of the application
* @see javax.ImageIO
* @author liluqun ([email]liluqun@263.net[/email])
* @version 1.0
*
*****************************************************/
public class GuiCamera
{
private String fileName; //文g的前~
private String defaultName = "GuiCamera";
static int serialNum=0;
private String imageFormat; //囑փ文g的格?
private String defaultImageFormat="png";
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
/****************************************************************
* 默认的文件前~为GuiCameraQ文件格式ؓPNG格式
* The default construct will use the default
* Image file surname "GuiCamera",
* and default image format "png"
****************************************************************/
public GuiCamera() {
fileName = defaultName;
imageFormat=defaultImageFormat;
}
/****************************************************************
* @param s the surname of the snapshot file
* @param format the format of the image file,
* it can be "jpg" or "png"
* 本构造支持JPG和PNG文g的存?
****************************************************************/
public GuiCamera(String s,String format) {
fileName = s;
imageFormat=format;
}
/****************************************************************
* 对屏q进行拍?
* snapShot the Gui once
****************************************************************/
public void snapShot() {
try {
//拯屏幕C个BufferedImage对象screenshot
BufferedImage screenshot = (new Robot()).createScreenCapture(new
Rectangle(0, 0, (int) d.getWidth(), (int) d.getHeight()));
serialNum++;
//Ҏ文g前缀变量和文件格式变量,自动生成文g?
String name=fileName+String.valueOf(serialNum)+"."+imageFormat;
File f = new File(name);
System.out.print("Save File "+name);
//screenshot对象写入囑փ文g
ImageIO.write(screenshot, imageFormat, f);
System.out.print("..Finished!\n");
}
catch (Exception ex) {
System.out.println(ex);
}
}
public static void main(String[] args)
{
GuiCamera cam= new GuiCamera("d:\\Hello", "png");//
cam.snapShot();
}
}
相关说明Q?br> 正本的保存:׃正文包含囄和样式,所以采取了正文的文档对象序列化到数据库中的方式进行保存和d
附g的保存:和正文的保存方式一?br>
׃涉及的功能比较多Q所以只是实C最基本的功能,其他的功能逐步d和完善,软g的界面样式如?br> 注:数据索功能已l完成[使用全文索技术实现]
自从JDK1.5的推出,JAVA的界面风格比原来漂亮多了
demo下蝲地址Q?a >http://www.fruitres.cn/useruploadfile/4/1473814960_demo.rar
演示地址Q?a >http://www.fruitres.cn/useruploadfile/4/1473814960_jnlp.jnlp
使用q程中发现问题欢q指正和交流
httpurlconnection = (HttpURLConnection) url.openConnection();
httpurlconnection.setDoOutput(true);
httpurlconnection.setRequestMethod("POST");
String username="username=02000001";
httpurlconnection.getOutputStream().write(username.getBytes());
httpurlconnection.getOutputStream().flush();
httpurlconnection.getOutputStream().close();
int code = httpurlconnection.getResponseCode();
System.out.println("code " + code);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(httpurlconnection!=null)
httpurlconnection.disconnect();
}
其中HttpURLConnection中的addRequestPropertyҎQƈ不是用来dParameter 的,而是用来讄h的头信息Q比如:
setRequestProperty("Content-type","text/html");
setRequestProperty("Connection", "close");
setRequestProperty("Content-Length",xxx);
当然如果不设|的话,可以走默认|上面的例子中没有进行相兌|,但是也可以正执?/P>
/**
* <p>Title: 囄叠加文字c?lt;/p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author sunfruit
* @version 1.0
*/
public class ImageAddWord {
Random random=new Random(System.currentTimeMillis());
BufferedImage buffImage=null;
Graphics2D g=null;
public ImageAddWord(int width, int height) {
buffImage=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
}
public ImageAddWord()
{
this(32,32);
}
/**
* 囄生成Ҏ,如果需要在已有的图片叠加文?需要先调用g.drawImageҎ图片绘?再将文字l制
* @param str String 文字内容
* @param ext String 文g后缀?png或是jpg
*/
public void drawWord(String str,String ext)
{
g=buffImage.createGraphics();
/**
如果要在已有的图片叠加文?q里调用g.drawImage()该方?l制囄,酌情L下面的方?BR> */
g.setColor(Color.WHITE);//在已有的囄叠加文字?该方法酌情添?BR> g.fillRect(0, 0, buffImage.getWidth(), buffImage.getHeight());//在已有的囄叠加文字?该方法酌情添?BR> g.setColor(Color.BLACK);//讑֮文字颜色
g.drawString(str,0,12);
String filepath=System.getProperty("java.io.tmpdir") +random.nextInt(99999)+"." + ext;
try {
ImageIO.write(buffImage, ext,
new File(filepath));
System.out.println("文g已经生成Q\lؓ"+filepath);
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void setFont(Font font)
{
g.setFont(font);
}
public static void main(String[] args) {
ImageAddWord imageAddWord=new ImageAddWord(132,16);
String str="A B C";
imageAddWord.drawWord(str,"png");
}
}
用JAVA~写的桌面程序启动的预显H口实例
介:
E序启动会预先显CZ个预昄口,ȝ序启动完毕后预显H口关闭
Ƣ迎大家提意见,交流
下蝲地址
说明Qapprun.jar可以直接q行 src中是源代?br /> http://m.tkk7.com/Files/sunfruit/apprunmodel.rar
下面l出具体的实C码,如果大家有更好的办法Q欢q交,共同q步
http://sunfruit.bokee.com/inc/session.rar
附g说明 :
1.工程使用JB做的Q用了log4jQlog4j的包在工E的WEB-INF的LIB文g夹内Q取出后重新引用?
2.可以直接发布war包,直接可以试
功能介:
手机通过串口与电脑连接以后,可以用该E序发送短?BR> 如果是红外连接那么可以用红外模拟串口的软gq行转换卛_
U外模拟串口的Y件下载地址http://heart5.chinap4.com/moto388/connect/ircomm2k/download.html
Ƣ迎大家提意见,交流
可以直接q行的程序下载地址Q环境配|参考包中的txt
http://m.tkk7.com/Files/sunfruit/comm.rar
源代码下载地址
http://m.tkk7.com/Files/sunfruit/comm_src.rar