- 浏览: 7856960 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
http://yangshangchuan.iteye.com/blog/2012401
首先,定义了一个统一的接口,以支持不同操作系统不同实现的透明切换:
Java代码 收藏代码
/**
*生成机器码的接口,不同平台有不同实现
* @author 杨尚川
*/
public interface SequenceService {
/**
* 获取机器码
* @return 机器码
*/
public String getSequence();
}
其次,定义了一个抽象类,实现了一些通用的功能,如生成MD5摘要、将很长的字符串以固定的位数分割开,以便于人类阅读(如将机器码 71F5DA7F495E7F706D47F3E63DC6349A 每4个一组,以-分割为71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A)、利用sigar来生成机器码。这里需要在pom.xml中加入sigar依赖。
Xml代码 收藏代码
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>sigar</artifactId>
<version>1.6.4</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
Java代码 收藏代码
import org.apdplat.module.system.service.PropertyHolder;
import org.apdplat.platform.log.APDPlatLogger;
import org.apdplat.platform.util.ConvertUtils;
import org.apdplat.platform.util.FileUtils;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.apdplat.platform.log.APDPlatLoggerFactory;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.NetFlags;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.Sigar;
/**
*机器码生成的通用服务
* @author 杨尚川
*/
public abstract class AbstractSequenceService implements SequenceService{
protected final APDPlatLogger LOG = APDPlatLoggerFactory.getAPDPlatLogger(getClass());
/**
* 对一段String生成MD5摘要信息
* @param message 要摘要的String
* @return 生成的MD5摘要信息
*/
protected String getMD5(String message) {
message += "{apdplat}";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
LOG.debug("MD5摘要长度:" + md.getDigestLength());
byte[] b = md.digest(message.getBytes("utf-8"));
String md5 = ConvertUtils.byte2HexString(b)+message.length();
return getSplitString(md5);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
LOG.error("MD5摘要失败",e);
}
return null;
}
/**
* 将很长的字符串以固定的位数分割开,以便于人类阅读
* @param str
* @return
*/
protected String getSplitString(String str){
return getSplitString(str, "-", 4);
}
/**
* 将很长的字符串以固定的位数分割开,以便于人类阅读
* 如将
* 71F5DA7F495E7F706D47F3E63DC6349A
* 以-,每4个一组,则分割为
* 71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A
* @param str 字符串
* @param split 分隔符
* @param length 长度
* @return
*/
protected String getSplitString(String str, String split, int length){
int len=str.length();
StringBuilder temp=new StringBuilder();
for(int i=0;i<len;i++){
if(i%length==0 && i>0){
temp.append(split);
}
temp.append(str.charAt(i));
}
String[] attrs=temp.toString().split(split);
StringBuilder finalMachineCode=new StringBuilder();
for(String attr : attrs){
if(attr.length()==length){
finalMachineCode.append(attr).append(split);
}
}
String result=finalMachineCode.toString().substring(0, finalMachineCode.toString().length()-1);
return result;
}
/**
* 利用sigar来生成机器码,当然这个实现不是很好,无法获得CPU ID,希望有兴趣的朋友来改进这个实现
* @param osName 操作系统类型
* @return 机器码
*/
protected String getSigarSequence(String osName) {
try {
File libFile = new File(FileUtils.getAbsolutePath("/WEB-INF/lib/"+PropertyHolder.getProperty("libsigar."+osName)));
LOG.debug("libsigar."+osName+" : "+libFile.getAbsolutePath());
System.load(libFile.getAbsolutePath());
Set<String> result = new HashSet<>();
Sigar sigar = new Sigar();
String[] ifaces = sigar.getNetInterfaceList();
for (String iface : ifaces) {
NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(iface); if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0
|| NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {
continue;
}
String mac = cfg.getHwaddr();
result.add(mac);
LOG.debug("mac: " + mac);
}
if(result.size()<1){
return null;
}
Properties props = System.getProperties();
String javaVersion = props.getProperty("java.version");
result.add(javaVersion);
LOG.debug("Java的运行环境版本: " + javaVersion);
String javaVMVersion = props.getProperty("java.vm.version");
result.add(javaVMVersion);
LOG.debug("Java的虚拟机实现版本: " + props.getProperty("java.vm.version"));
String osVersion = props.getProperty("os.version");
result.add(osVersion);
LOG.debug("操作系统的版本: " + props.getProperty("os.version"));
Mem mem = sigar.getMem();
// 内存总量
String totalMem = mem.getTotal() / 1024L + "K av";
LOG.debug("内存总量: " + totalMem);
result.add(totalMem);
LOG.debug("result: " + result);
String machineCode = getMD5(result.toString());
return machineCode;
} catch (Throwable ex) {
LOG.error("生成 "+osName+" 平台下的机器码失败", ex);
}
return null;
}
}
最后,我们分别看看不同平台的实现。
Windows:
Java代码 收藏代码
/**
*在Windows平台上生成机器码
* @author 杨尚川
*/
public final class WindowsSequenceService extends AbstractSequenceService{
@Override
public String getSequence() {
String cpuID=getCPUSerial();
String hdID=getHDSerial("C");
if(cpuID==null || hdID==null){
return null;
}
String machineCode = getMD5(cpuID+hdID);
return machineCode;
}
/**
*
* @param drive 硬盘驱动器分区 如C,D
* @return 该分区的卷标
*/
private String getHDSerial(String drive) {
StringBuilder result = new StringBuilder();
try {
File file = File.createTempFile("tmp", ".vbs");
file.deleteOnExit();
try (FileWriter fw = new java.io.FileWriter(file)) {
String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
+ "Set colDrives = objFSO.Drives\n" + "Set objDrive = colDrives.item(\"" + drive + "\")\n"
+ "Wscript.Echo objDrive.SerialNumber";
fw.write(vbs);
}
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = input.readLine()) != null) {
result.append(line);
}
}
file.delete();
} catch (Throwable e) {
LOG.error("生成HDSerial失败", e);
}
if (result.length() < 1) {
LOG.info("无磁盘ID被读取");
}
return result.toString();
}
/**
* 获取CPU号,多CPU时,只取第一个
* @return
*/
private String getCPUSerial() {
StringBuilder result = new StringBuilder();
try {
File file = File.createTempFile("tmp", ".vbs");
file.deleteOnExit();
try (FileWriter fw = new FileWriter(file)) {
String vbs = "On Error Resume Next \r\n\r\n" + "strComputer = \".\" \r\n"
+ "Set objWMIService = GetObject(\"winmgmts:\" _ \r\n"
+ " & \"{impersonationLevel=impersonate}!\\\\\" & strComputer & \"\\root\\cimv2\") \r\n"
+ "Set colItems = objWMIService.ExecQuery(\"Select * from Win32_Processor\") \r\n "
+ "For Each objItem in colItems\r\n " + " Wscript.Echo objItem.ProcessorId \r\n "
+ " exit for ' do the first cpu only! \r\n" + "Next ";
fw.write(vbs);
}
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = input.readLine()) != null) {
result.append(line);
}
}
file.delete();
} catch (Throwable e) {
LOG.error("生成CPUSerial失败", e);
}
if (result.length() < 1) {
LOG.info("无CPU_ID被读取");
}
return result.toString();
}
public static void main(String[] args) {
SequenceService s = new WindowsSequenceService();
String seq = s.getSequence();
System.out.println(seq);
}
}
Linux:
Java代码 收藏代码
/**
*在Linux平台上生成机器码
* @author 杨尚川
*/
public class LinuxSequenceService extends AbstractSequenceService{
@Override
public String getSequence() {
return getSigarSequence("linux");
}
public static void main(String[] args) {
SequenceService s = new LinuxSequenceService();
String seq = s.getSequence();
System.out.println(seq);
}
}
Mac OS X:
Java代码 收藏代码
/**
*在Mac OS X平台上生成机器码
* @author 杨尚川
*/
public class MacSequenceService extends AbstractSequenceService{
@Override
public String getSequence() {
return getSigarSequence("mac");
}
public static void main(String[] args) {
SequenceService s = new MacSequenceService();
String seq = s.getSequence();
System.out.println(seq);
}
}
Solaris:
Java代码 收藏代码
/**
*在Solaris平台上生成机器码
* @author 杨尚川
*/
public class SolarisSequenceService extends AbstractSequenceService{
@Override
public String getSequence() {
return getSigarSequence("solaris");
}
public static void main(String[] args) {
SequenceService s = new SolarisSequenceService();
String seq = s.getSequence();
System.out.println(seq);
}
}
首先,定义了一个统一的接口,以支持不同操作系统不同实现的透明切换:
Java代码 收藏代码
/**
*生成机器码的接口,不同平台有不同实现
* @author 杨尚川
*/
public interface SequenceService {
/**
* 获取机器码
* @return 机器码
*/
public String getSequence();
}
其次,定义了一个抽象类,实现了一些通用的功能,如生成MD5摘要、将很长的字符串以固定的位数分割开,以便于人类阅读(如将机器码 71F5DA7F495E7F706D47F3E63DC6349A 每4个一组,以-分割为71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A)、利用sigar来生成机器码。这里需要在pom.xml中加入sigar依赖。
Xml代码 收藏代码
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>sigar</artifactId>
<version>1.6.4</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
Java代码 收藏代码
import org.apdplat.module.system.service.PropertyHolder;
import org.apdplat.platform.log.APDPlatLogger;
import org.apdplat.platform.util.ConvertUtils;
import org.apdplat.platform.util.FileUtils;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.apdplat.platform.log.APDPlatLoggerFactory;
import org.hyperic.sigar.Mem;
import org.hyperic.sigar.NetFlags;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.Sigar;
/**
*机器码生成的通用服务
* @author 杨尚川
*/
public abstract class AbstractSequenceService implements SequenceService{
protected final APDPlatLogger LOG = APDPlatLoggerFactory.getAPDPlatLogger(getClass());
/**
* 对一段String生成MD5摘要信息
* @param message 要摘要的String
* @return 生成的MD5摘要信息
*/
protected String getMD5(String message) {
message += "{apdplat}";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
LOG.debug("MD5摘要长度:" + md.getDigestLength());
byte[] b = md.digest(message.getBytes("utf-8"));
String md5 = ConvertUtils.byte2HexString(b)+message.length();
return getSplitString(md5);
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
LOG.error("MD5摘要失败",e);
}
return null;
}
/**
* 将很长的字符串以固定的位数分割开,以便于人类阅读
* @param str
* @return
*/
protected String getSplitString(String str){
return getSplitString(str, "-", 4);
}
/**
* 将很长的字符串以固定的位数分割开,以便于人类阅读
* 如将
* 71F5DA7F495E7F706D47F3E63DC6349A
* 以-,每4个一组,则分割为
* 71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A
* @param str 字符串
* @param split 分隔符
* @param length 长度
* @return
*/
protected String getSplitString(String str, String split, int length){
int len=str.length();
StringBuilder temp=new StringBuilder();
for(int i=0;i<len;i++){
if(i%length==0 && i>0){
temp.append(split);
}
temp.append(str.charAt(i));
}
String[] attrs=temp.toString().split(split);
StringBuilder finalMachineCode=new StringBuilder();
for(String attr : attrs){
if(attr.length()==length){
finalMachineCode.append(attr).append(split);
}
}
String result=finalMachineCode.toString().substring(0, finalMachineCode.toString().length()-1);
return result;
}
/**
* 利用sigar来生成机器码,当然这个实现不是很好,无法获得CPU ID,希望有兴趣的朋友来改进这个实现
* @param osName 操作系统类型
* @return 机器码
*/
protected String getSigarSequence(String osName) {
try {
File libFile = new File(FileUtils.getAbsolutePath("/WEB-INF/lib/"+PropertyHolder.getProperty("libsigar."+osName)));
LOG.debug("libsigar."+osName+" : "+libFile.getAbsolutePath());
System.load(libFile.getAbsolutePath());
Set<String> result = new HashSet<>();
Sigar sigar = new Sigar();
String[] ifaces = sigar.getNetInterfaceList();
for (String iface : ifaces) {
NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(iface); if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0
|| NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {
continue;
}
String mac = cfg.getHwaddr();
result.add(mac);
LOG.debug("mac: " + mac);
}
if(result.size()<1){
return null;
}
Properties props = System.getProperties();
String javaVersion = props.getProperty("java.version");
result.add(javaVersion);
LOG.debug("Java的运行环境版本: " + javaVersion);
String javaVMVersion = props.getProperty("java.vm.version");
result.add(javaVMVersion);
LOG.debug("Java的虚拟机实现版本: " + props.getProperty("java.vm.version"));
String osVersion = props.getProperty("os.version");
result.add(osVersion);
LOG.debug("操作系统的版本: " + props.getProperty("os.version"));
Mem mem = sigar.getMem();
// 内存总量
String totalMem = mem.getTotal() / 1024L + "K av";
LOG.debug("内存总量: " + totalMem);
result.add(totalMem);
LOG.debug("result: " + result);
String machineCode = getMD5(result.toString());
return machineCode;
} catch (Throwable ex) {
LOG.error("生成 "+osName+" 平台下的机器码失败", ex);
}
return null;
}
}
最后,我们分别看看不同平台的实现。
Windows:
Java代码 收藏代码
/**
*在Windows平台上生成机器码
* @author 杨尚川
*/
public final class WindowsSequenceService extends AbstractSequenceService{
@Override
public String getSequence() {
String cpuID=getCPUSerial();
String hdID=getHDSerial("C");
if(cpuID==null || hdID==null){
return null;
}
String machineCode = getMD5(cpuID+hdID);
return machineCode;
}
/**
*
* @param drive 硬盘驱动器分区 如C,D
* @return 该分区的卷标
*/
private String getHDSerial(String drive) {
StringBuilder result = new StringBuilder();
try {
File file = File.createTempFile("tmp", ".vbs");
file.deleteOnExit();
try (FileWriter fw = new java.io.FileWriter(file)) {
String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
+ "Set colDrives = objFSO.Drives\n" + "Set objDrive = colDrives.item(\"" + drive + "\")\n"
+ "Wscript.Echo objDrive.SerialNumber";
fw.write(vbs);
}
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = input.readLine()) != null) {
result.append(line);
}
}
file.delete();
} catch (Throwable e) {
LOG.error("生成HDSerial失败", e);
}
if (result.length() < 1) {
LOG.info("无磁盘ID被读取");
}
return result.toString();
}
/**
* 获取CPU号,多CPU时,只取第一个
* @return
*/
private String getCPUSerial() {
StringBuilder result = new StringBuilder();
try {
File file = File.createTempFile("tmp", ".vbs");
file.deleteOnExit();
try (FileWriter fw = new FileWriter(file)) {
String vbs = "On Error Resume Next \r\n\r\n" + "strComputer = \".\" \r\n"
+ "Set objWMIService = GetObject(\"winmgmts:\" _ \r\n"
+ " & \"{impersonationLevel=impersonate}!\\\\\" & strComputer & \"\\root\\cimv2\") \r\n"
+ "Set colItems = objWMIService.ExecQuery(\"Select * from Win32_Processor\") \r\n "
+ "For Each objItem in colItems\r\n " + " Wscript.Echo objItem.ProcessorId \r\n "
+ " exit for ' do the first cpu only! \r\n" + "Next ";
fw.write(vbs);
}
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = input.readLine()) != null) {
result.append(line);
}
}
file.delete();
} catch (Throwable e) {
LOG.error("生成CPUSerial失败", e);
}
if (result.length() < 1) {
LOG.info("无CPU_ID被读取");
}
return result.toString();
}
public static void main(String[] args) {
SequenceService s = new WindowsSequenceService();
String seq = s.getSequence();
System.out.println(seq);
}
}
Linux:
Java代码 收藏代码
/**
*在Linux平台上生成机器码
* @author 杨尚川
*/
public class LinuxSequenceService extends AbstractSequenceService{
@Override
public String getSequence() {
return getSigarSequence("linux");
}
public static void main(String[] args) {
SequenceService s = new LinuxSequenceService();
String seq = s.getSequence();
System.out.println(seq);
}
}
Mac OS X:
Java代码 收藏代码
/**
*在Mac OS X平台上生成机器码
* @author 杨尚川
*/
public class MacSequenceService extends AbstractSequenceService{
@Override
public String getSequence() {
return getSigarSequence("mac");
}
public static void main(String[] args) {
SequenceService s = new MacSequenceService();
String seq = s.getSequence();
System.out.println(seq);
}
}
Solaris:
Java代码 收藏代码
/**
*在Solaris平台上生成机器码
* @author 杨尚川
*/
public class SolarisSequenceService extends AbstractSequenceService{
@Override
public String getSequence() {
return getSigarSequence("solaris");
}
public static void main(String[] args) {
SequenceService s = new SolarisSequenceService();
String seq = s.getSequence();
System.out.println(seq);
}
}
发表评论
-
复习:强迫线程顺序执行方式
2019-01-03 23:42 1483方法1: 三个线程,t1,t2,t3,如果一定要按顺序执行, ... -
(转)不错的前后端处理异常的方法
2019-01-02 23:16 1967前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是 ... -
info q的极客时间大咖说等资料下载
2018-08-15 08:40 3416info q的极客时间大咖说等资料下载,还有不少思维导图 链 ... -
CXF 客户端超时时间设置(非Spring配置方式)
2018-07-03 22:38 2187import org.apache.cxf.endpoint. ... -
(转)synchronized关键字画像:正确打开方式
2018-06-14 09:25 449https://mp.weixin.qq.com/s/b3Sx ... -
CountDownLatch的例子
2018-06-13 14:10 632public class StatsDemo { ... -
两道面试题,带你解析Java类加载机制
2018-06-12 16:29 556https://mp.weixin.qq.com/s/YTa0 ... -
Spring中获取request的几种方法,及其线程安全性分析
2018-06-11 09:03 625https://mp.weixin.qq.com/s/KeFJ ... -
内部类小结
2018-06-06 10:25 399https://mp.weixin.qq.com/s/hErv ... -
JVM虚拟机小结1
2018-06-04 20:43 4651 jps -l //列出详细的类名和进程ID 2)jps ... -
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3043微软提供了不少命令行 ... -
(收藏)深入分析Java的序列化与反序列化
2018-05-30 15:21 557https://mp.weixin.qq.com/s/T2Bn ... -
apache common包中的序列化工具
2018-05-30 09:10 1780什么是序列化 我们的 ... -
JAVA8 JVM的变化: 元空间(Metaspace)
2018-05-24 22:30 913本文将会分享至今为至我收集的关于永久代(Permanent G ... -
(转)服务器性能指标(一)——负载(Load)分析及问题排查
2018-05-21 21:03 1266原创: Hollis Hollis 负载 ... -
(转)对象复用
2018-05-20 15:27 809public class Student { priv ... -
mapreduce中入门中要注意的几点
2018-05-06 08:59 621在 mapreduce中,比如有如下的词: I love b ... -
HDFS的基本操作
2018-05-02 21:47 883-mkdir 在HDFS创建目录 ... -
一个不错的开源工具类,专门用来解析日志头部的,好用
2018-05-02 20:00 711一个不错的开源工具类,专门用来解析日志头部的,好用。 http ... -
介绍个不错的RESTFUL MOCK的工具wiremock
2018-04-27 21:02 1855介绍个不错的RESTFUL MOCK的工具wiremock,地 ...
相关推荐
java程序编写获取扫码枪扫码程序,并将扫码枪扫码有数据库MySQL数据进行对比预警,解决相关行业使用扫码枪进行出货重复使用相关商品码问题。该程序连接MySQL数据库,可同时部署到多台机器上进行设备比对。底层也实现...
从 JIT 技术开始,Java 的程序都经过一次转换之后才变 成机器码。很多老牌的第三方虚拟机都使用一种叫做"动态编译"的技术,也就是说虚拟机 [9]实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行...
文献综述 计算机科学与技术 基于 JAVA 的模拟 ATM 系统的设计与实现 ATM 是 Automatic Teller Machine 的缩写,即自动柜员机。它是有计算机控制的持 卡人自我服务型的金融专用设备。 ATM 机可以向持卡人提供提款、...
JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行。 Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、...
JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行。 Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、...
JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行。 Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、...
另外,在JDBC诞生之后,Java在数据库应用领域获得了成功的应用,大大降低了Java语言操作数据库的复杂程度,可以将重心放在功能实现上。 SQL Server 2000是微软公司开发的一个关系数据库管理系统,以Transact_SQL作为...
JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行。 Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、...
JVM是Java的核心组成部分,它可以将Java代码解释成特定平台上的机器码,从而实现跨平台运行。 Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、...
MQTT可以由多种语言来实现,下面来记录一下Java语言的简单实现 1、首先在idea里面配置所需库 https://pan.baidu.com/s/1QW4Pks_nEQW1o1JktgJOmg 提取码:kj7e 获得jar包 2、下面附上客户端类和回调类 回调类的...
写完Jaa代码后,机器并不认识我们写的Java代码,需要进行编译成为字节码,编译 后的文件叫做clas文件。如上图所示的 Hello, class文件。 3:类装载 Classloader 类裝载的功能是为执行程序寻找和装载所需要的类 ...
〔1分〕 2 使用java编译器,编译源文件得到字节码文件。 〔2分〕 3 运行java程序,分两种java应用程序必须通过java解释器来解释执行,java小应用程序 必须使用解释器和浏览器运行程序。 〔2分〕 3、 java源文件的...
(1分) 2 使用java编译器,编译源文件得到字节码文件。 (2分) 3 运行java程序,分两种java应用程序必须通过java解释器来解释执行,java小应用程序 必须使用解释器和浏览器运行程序。 (2分) 3、 java源文件的...
C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作 其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行 Python 和 C Python这门语言是由C开发而来...
通过使用这个对象,Servlet可以记录事件、得到资源并得到来自Servlet引擎的类(例如RequestDispatcher对象)。一个Servlet只能运行在一个Servlet环境中,但是不同的Servlet可以在Servlet引擎上有不同的视图。 如果...
自动柜员机,即ATM,是指银行在不同地点设置一种小型机器,利用一张信用卡大小 的胶卡上的磁带记录客户的基本户口资料(通常就是银行卡),让客户可以透过机器进 行提款、存款、转账等银行柜台服务,大多数客户都把...
本设计成功实现了基于1-W器件是软件加密技术的研究方案,论证了利用1-W器件作为软件加密技术的“软件狗”和其硬件序列号作为软件加密机器码的可行性和可靠性,是作为共享软件加密方的良好方案。 关键词:软件保护;...
山寨QQ分为用户端和服务器端,主要用到的Java知识点有:多线程、网络编程、IO流,如果能够加入数据库当然更好,可是我在家一直没网,没有数据库,所以就把用户信息全部储存在文件中了。 服务器端3000号端口作为一个...
机器学习:一个计算机程序在完成任务T之后,获得经验E,而该经验的效果可以通过P得以表现,如果随着T的增加,借助P来表现的E也可以同步增进,则称这样的程序为机器学习系统。 自我完善、自我修正、自我增强。 2.为...
通过本源码下载,学生不仅能够获得微信小程序开发的实战经验,还能够理解如何根据用户行为和偏好来进行智能推荐,这对于未来从事相关工作具有重要意义。同时,该源码也适合作为教学案例,帮助学生掌握当前流行的前端...