精华内容
下载资源
问答
  • java代码生成器(亲测,好用)

    热门讨论 2017-03-23 13:16:47
    亲测,好用,欢迎下载+教程
  • 很强大的java代码混淆工具 Jocky

    热门讨论 2014-09-30 15:29:52
    Jockey跟其他混淆工具不同的是:它是直接对编译过程做文章,也就是在把java文件编译为class文件的过程中对代码进行混淆,混淆后的代码中包含很多JVM 指令,大家知道JVM指令是面向机器的,人类一般很难看懂!...
  • java代码编写规范

    热门讨论 2013-04-11 17:07:15
    Java程序员编写代码时应当遵循的一些基本规范
  • 微信抢红包java代码及demo和说明(收集待学习)

    千次下载 热门讨论 2015-03-27 21:07:17
    微信抢红包java代码及demo和说明
  • 内存中动态编译执行java代码

    热门讨论 2014-10-25 11:27:58
    不需要任何java类文件,将字符串输入到内存,然后编译,加载,执行,整个过程全部在内存中实现,不会产生.java和.class文件,做到了洁净无污染。
  • Java代码混淆工具 Proguard4.10(官方免费下载)

    千次下载 热门讨论 2013-12-15 14:41:30
    java -jar ../lib/proguard.jar @proguard.pro 运行之后在examples目录下生成 proguard_out.jar 3、新手入门请参照本目录下文档《ProGuard代码混淆操作说明.docx》 先牛刀小试一下,混淆自己本地的工程,支持jar,...
  • MQTT推送简单例子服务端java代码实现

    千次下载 热门讨论 2014-04-25 13:53:04
    IBM的MQTT给了一个PHP的服务端代码,在网上找了一个JAVA实现服务端代码的例子,调通了。如果想做这个例子需要自己用电脑建一个wifi,手机连上这个wifi,代码中要改几个个地方 1 android服务里有几个MQTT_HOST是ip...
  • Python代码转为java代码

    千次阅读 2021-01-29 08:03:20
    下面是一段Python的加密代码 :import md5def encrypted_id(id):byte1 = bytearray('3go8&$8*3*3h0k(2)2')byte2 = bytearray(id)byte1_len = len(byte1)for i in xrange(len(byte2)):byte2[i] = byte2[i]^byte1...

    下面是一段Python的加密代码 :

    import md5

    def encrypted_id(id):

    byte1 = bytearray('3go8&$8*3*3h0k(2)2')

    byte2 = bytearray(id)

    byte1_len = len(byte1)

    for i in xrange(len(byte2)):

    byte2[i] = byte2[i]^byte1[i%byte1_len]

    m = md5.new()

    m.update(byte2)

    result = m.digest().encode('base64')[:-1]

    result = result.replace('/', '_')

    result = result.replace('+', '-')

    return result

    请问如何改写为java代码?

    下面是我改写的java代码,但是返回的结果始终为空:

    public static String md5(String musicID) throws NoSuchAlgorithmException {

    System.out.print(musicID);

    String result;

    byte[] byte1, byte2;

    String word = "3go8&$8*3*3h0k(2)2";

    byte1 = word.getBytes();

    byte2 = musicID.getBytes();

    int byte2_len = byte2.length;

    int byte1_len=byte1.length;

    for (int i = 0; i < byte2_len; i++) {

    byte2[i] = (byte) (byte2[i] ^ byte1[i % byte1_len]);

    }

    MessageDigest md5 = MessageDigest.getInstance("MD5");

    md5.update(byte2);

    byte[] digest = md5.digest();

    result=new String(Base64.decodeBase64(digest));

    result = result.replace('/', '_');

    result = result.replace('+', '-');

    return result;

    }

    展开全文
  • Java基础——java代码规范详细版

    万次阅读 多人点赞 2019-07-03 11:41:57
    Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改。本文档中没有说明的地方,请参看SUN Java标准代码规范。如果两边有冲突,以SUN Java标准为准。 1. 标识符命名规范 ...

    Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改。本文档中没有说明的地方,请参看SUN Java标准代码规范。如果两边有冲突,以SUN Java标准为准。

    1. 标识符命名规范

    1.1 概述

    标识符的命名力求做到统一、达意和简洁。

    1.1.1 统一

    统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。

    1.1.2 达意

    达意是指,标识符能准确的表达出它所代表的意义,比如: newSupplier, OrderPaymentGatewayService等;而 supplier1, service2idtts等则不是好的命名方式。准确有两成含义,一是正确,二是丰富。如果给一个代表供应商的变量起名是 order,显然没有正确表达。同样的,supplier1, 远没有targetSupplier意义丰富。

    1.1.3 简洁

    简洁是指,在统一和达意的前提下,用尽量少的标识符。如果不能达意,宁愿不要简洁。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太长, transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。

    1.1.4 骆驼法则

    Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如: supplierName, addNewContract,而不是 supplier_name, add_new_contract

    1.1.5 英文 vs 拼音

    尽量使用通俗易懂的英文单词,如果不会可以向队友求助,实在不行则使用汉语拼音,避免拼音与英文混用。比如表示归档,用archive比较好, pigeonhole则不好,用guiDang尚可接受。

    1.2 包名

    使用小写字母如 com.xxx.settlment,不要 com.xxx.Settlement
    单词间不要用字符隔开,比如 com.xxx.settlment.jsfutil,而不要com.xxx.settlement.jsf_util

    1.3 类名

    1.3.1 首字母大写

    类名要首字母大写,比如 SupplierService, PaymentOrderAction;不要 supplierService, paymentOrderAction.

    1.3.2 后缀

    类名往往用不同的后缀表达额外的意思,如下表:

    后缀名

    意义

    举例

    Service

    表明这个类是个服务类,里面包含了给其他类提同业务服务的方法

    PaymentOrderService

    Impl

    这个类是一个实现类,而不是接口

    PaymentOrderServiceImpl

    Inter

    这个类是一个接口

    LifeCycleInter

    Dao

    这个类封装了数据访问方法

    PaymentOrderDao

    Action

    直接处理页面请求,管理页面逻辑了类

    UpdateOrderListAction

    Listener

    响应某种事件的类

    PaymentSuccessListener

    Event

    这个类代表了某种事件

    PaymentSuccessEvent

    Servlet

    一个Servlet

    PaymentCallbackServlet

    Factory

    生成某种对象工厂的类

    PaymentOrderFactory

    Adapter

    用来连接某种以前不被支持的对象的类

    DatabaseLogAdapter

    Job

    某种按时间运行的任务

    PaymentOrderCancelJob

    Wrapper

    这是一个包装类,为了给某个类提供没有的能力

    SelectableOrderListWrapper

    Bean

    这是一个POJO

    MenuStateBean

    1.4 方法名

    首字母小写,如 addOrder() 不要 AddOrder()
    动词在前,如 addOrder(),不要orderAdd()
    动词前缀往往表达特定的含义,如下表:

    前缀名

    意义

    举例

    create

    创建

    createOrder()

    delete

    删除

    deleteOrder()

    add

    创建,暗示新创建的对象属于某个集合

    addPaidOrder()

    remove

    删除

    removeOrder()

    init或则initialize

    初始化,暗示会做些诸如获取资源等特殊动作

    initializeObjectPool

    destroy

    销毁,暗示会做些诸如释放资源的特殊动作

    destroyObjectPool

    open

    打开

    openConnection()

    close

    关闭

    closeConnection()<

    read

    读取

    readUserName()

    write

    写入

    writeUserName()

    get

    获得

    getName()

    set

    设置

    setName()

    prepare

    准备

    prepareOrderList()

    copy

    复制

    copyCustomerList()

    modity

    修改

    modifyActualTotalAmount()

    calculate

    数值计算

    calculateCommission()

    do

    执行某个过程或流程

    doOrderCancelJob()

    dispatch

    判断程序流程转向

    dispatchUserRequest()

    start

    开始

    startOrderProcessing()

    stop

    结束

    stopOrderProcessing()

    send

    发送某个消息或事件

    sendOrderPaidMessage()

    receive

    接受消息或时间

    receiveOrderPaidMessgae()

    respond

    响应用户动作

    responseOrderListItemClicked()

    find

    查找对象

    findNewSupplier()

    update

    更新对象

    updateCommission()

    find方法在业务层尽量表达业务含义,比如 findUnsettledOrders(),查询未结算订单,而不要findOrdersByStatus() 数据访问层,find,update等方法可以表达要执行的sql,比如findByStatusAndSupplierIdOrderByName(Status.PAID, 345)

    1.5 域(field)名

    1.5.1 静态常量

    全大写用下划线分割,如

    public static find String ORDER_PAID_EVENT = “ORDER_PAID_EVENT”;

    1.5.2 枚举

    全大写,用下划线分割,如

    public enum Events {
    ORDER_PAID,
    ORDER_CREATED

    }

    1.5.3 其他

    首字母小写,骆驼法则,如:

    public String orderName;

    1.6 局部变量名

    参数和局部变量名首字母小写,骆驼法则。尽量不要和域冲突,尽量表达这个变量在方法中的意义。

    2. 代码格式

    用空格字符缩进源代码,不要用tab,每个缩进4个空格。

    2.1 源文件编码

    源文件使用utf-8编码,结尾用unix n 分格。

    2.2 行宽

    行宽度不要超过80Eclipse标准

    2.3 包的导入

    删除不用的导入,尽量不要使用整个包的导入。在eclipse下经常使用快捷键 ctrl+shift+o 修正导入。

    2.4 类格式

    2.5 域格式

    每行只能声明一个域。
    域的声明用空行隔开。

    2.5 方法格式

    2.6 代码块格式

    2.6.1 缩进风格

    大括号的开始在代码块开始的行尾,闭合在和代码块同一缩进的行首,例如:

    package com.test;

    public class TestStyle extends SomeClass implements AppleInter, BananaInter {

        public static final String THIS_IS_CONST = "CONST VALUE";

        private static void main(String[] args) {

            int localVariable = 0;

        }

        public void compute(String arg) {

            if (arg.length() >  0) {

                System.out.println(arg);

            }

     

            for (int i = 0; i < 10; i++) {

                  System.out.println(arg);

            }

           while (condition) {

           }

          do {

              otherMethod();

          } while (condition);

     

      switch (i) {

      case 0:

         callFunction();

         break;

      case 1:

         callFunctionb();

         break;

      default:

         break;

      }

     }

    }

    2.6.2 空格的使用

    2.6.2.1 表示分割时用一个空格

    不能这样:

    if       (               a >        b   )            {

        //do something here

    };

    2.6.2.2 二元三元运算符两边用一个空格隔开

    如下:

    a + b = c;

    b - d = e;

    return a == b ? 1 : 0;

    不能如下:

    a+b=c;

    b-d=e;

    return a==b?1:0;

    2.6.2.3 逗号语句后如不换行,紧跟一个空格

    如下:

    call(a, b, c);

    不能如下:

    call(a,b,c);

    2.6.3 空行的使用

    空行可以表达代码在语义上的分割,注释的作用范围,等等。将类似操作,或一组操作放在一起不用空行隔开,而用空行隔开不同组的代码, 如下:

    order = orderDao.findOrderById(id);

     

    //update properties

    order.setUserName(userName);

    order.setPrice(456);

    order.setStatus(PAID);

    orderService.updateTotalAmount(order);

    session.saveOrUpdate(order);

    上例中的空行,使注释的作用域很明显.

    • 连续两行的空行代表更大的语义分割。
    • 方法之间用空行分割
    • 域之间用空行分割
    • 超过十行的代码如果还不用空行分割,就会增加阅读困难

    3. 注释规范

    3.1 注释 vs 代码

    • 注释宜少而精,不宜多而滥,更不能误导
    • 命名达意,结构清晰, 类和方法等责任明确,往往不需要,或者只需要很少注释,就可以让人读懂;相反,代码混乱,再多的注释都不能弥补。所以,应当先在代码本身下功夫。
    • 不能正确表达代码意义的注释,只会损害代码的可读性。
    • 过于详细的注释,对显而易见的代码添加的注释,罗嗦的注释,还不如不写。
    • 注释要和代码同步,过多的注释会成为开发的负担
    • 注释不是用来管理代码版本的,如果有代码不要了,直接删除,svn会有记录的,不要注释掉,否则以后没人知道那段注释掉的代码该不该删除。

    3.2 Java Doc

    表明类、域和方法等的意义和用法等的注释,要以javadoc的方式来写。Java Doc是给类的使用者来看的,主要介绍 是什么,怎么用等信息。凡是类的使用者需要知道,都要用Java Doc 来写。非Java Doc的注释,往往是个代码的维护者看的,着重告述读者为什么这样写,如何修改,注意什么问题等。 如下:

    /**

    * This is a class comment

    */

    public class TestClass {

        /**

        * This is a field comment

        */

        public String name;

        /**

        * This is a method comment

        */

        public void call() {

        }

    }

    3.3 块级别注释

    3.3.1 块级别注释,单行时用 //, 多行时用 /* .. */

    3.3.2 较短的代码块用空行表示注释作用域

    3.3.3 较长的代码块要用

    /*------ start: ------*/

    /*-------- end: -------*/

    包围
    如:

    /*----------start: 订单处理 ------- */

    //取得dao

    OrderDao dao = Factory.getDao("OrderDao");

    /* 查询订单 */

    Order order = dao.findById(456);

    //更新订单

    order.setUserName("uu");

    order.setPassword("pass");

    order.setPrice("ddd");

    orderDao.save(order);

    /*----------end: 订单处理 ------- */

    3.3.4 可以考虑使用大括号来表示注释范围

    使用大括号表示注释作用范围的例子:

    /*----------订单处理 ------- */

    {

     //取得dao

     OrderDao dao = Factory.getDao("OrderDao");

     /* 查询订单 */

     Order order = dao.findById(456);

     

     //更新订单

     order.setUserName("uu");

     order.setPassword("pass");

     order.setPrice("ddd");

     

     orderDao.save(order);

    }

    3.4 行内注释

    行内注释用 // 写在行尾

    4 最佳实践和禁忌

    4.1 每次保存的时候,都让你的代码是最美的

    程序员都是懒惰的,不要想着等我完成了功能,再来优化代码的格式和结构,等真的把功能完成,很少有人会再愿意回头调整代码。

    4.2 使用log而不是System.out.println()

    log可以设定级别,可以控制输出到哪里,容易区分是在代码的什么地方打印的,而System.out.print则不行。而且,System.out.print的速度很慢。所以,除非是有意的,否则,都要用log。至少在提交到svn之前把System.out.print换成log

    4.3 每个if while for等语句,都不要省略大括号{}

    看下面的代码:

    if (a > b)

        a++;

    如果在以后维护的时候,需要在a > b 时,把b++,一步小心就会写成:

    if (a > b)

        a++;

        b++;

    这样就错了,因为无论ab是什么关系,b++都会执行。 如果一开始就这样写:

    if (a > b)  {

        a++;

    }

    相信没有哪个笨蛋会把b++添加错的。而且,这个大括号使作用范围更明显,尤其是后面那行很长要折行时。

    4.4 善用TODO:

    在代码中加入 //TODO: ,大部分的ide都会帮你提示,让你知道你还有什么事没有做。比如:

    if (order.isPaid()) {

        //TODO: 更新订单

    }

    4.5 在需要留空的地方放一个空语句或注释,告述读者,你是故意的

    比如:

    if (!exists(order)) {

        ;

    }

    或:

    if (!exists(order)) {

        //nothing to do

    }

    4.6 不要再对boolean值做true false判断

    比如:

    if (order.isPaid() == true) {

        // Do something here

    }

    不如写成:

    if (order.isPaid()) {

        //Do something here

    }

    后者读起来就很是 if order is paid, …. 要比 if order’s isPaid method returns true, … 更容易理解

    4.7 减少代码嵌套层次

    代码嵌套层次达3层以上时,一般人理解起来都会困难。下面的代码是一个简单的例子:

    public void demo(int a, int b, int c) {

        if (a > b) {

            if (b > c) {

                doJobA();

            } else if (b < c) {

                doJobB()

            }

        } else {

            if (b > c) {

                if (a < c) {

                    doJobC();

                }

            }

        }

    }

    减少嵌套的方法有很多:

    • 合并条件
    • 利用 return 以省略后面的else
    • 利用子方法

    比如上例,合并条件后成为:

    public void demo(int a, int b, int c) {

        if (a > b && b > c) {

            doJobA();

        }

        if (a > b && c > b) {

            doJobB();

        }

        if (a <= b && c < b && a < c) {

            doJobC();

        }

    }

    如果利用return 则成为:

    public void demo(int a, int b, int c) {

        if (a > b) {

            if (b > c) {

                doJobA();

                return;

            }

            doJobB()

            return;

        }

     

        if (b > c) {

            if (a < c) {

                doJobC();

            }

        }

    }

    利用子方法,就是将嵌套的程序提取出来放到另外的方法里。

    4.8 程序职责单一

    关注点分离是软件开发的真理。人类自所以能够完成复杂的工作,就是因为人类能够将工作分解到较小级别的任务上,在做每个任务时关注更少的东西。让程序单元的职责单一,可以使你在编写这段程序时关注更少的东西,从而降低难度,减少出错。

    4.9 变量的声明,初始化和被使用尽量放到一起

    比方说如下代码:

    int orderNum= getOrderNum();

    //do something withou orderNum here

    call(orderNum);

    上例中的注释处代表了一段和orderNum不相关的代码。orderNum的声明和初始化离被使用的地方相隔了很多行的代码,这样做不好,不如这样:

    //do something withou orderNum here

    int orderNum= getOrderNum();

    call(orderNum);

    4.10 缩小变量的作用域

    能用局部变量的,不要使用实例变量,能用实例变量的,不要使用类变量。变量的生存期越短,以为着它被误用的机会越小,同一时刻程序员要关注的变量的状态越少。实例变量和类变量默认都不是线程安全的,局部变量是线程安全的。比如如下代码:

    public class OrderPayAction{

        private Order order;

     

        public void doAction() {

            order = orderDao.findOrder();

            doJob1();

            doJob2();

        }

     

        private void doJob1() {

            doSomething(order);

        }

     

        private void doJob2() {

            doOtherThing(order);

        }

    }

    上例中order只不过担当了在方法间传递参数之用,用下面的方法更好:

    public class OrderPayAction{

        public void doAction() {

            order = orderDao.findOrder();

            doJob1(order);

            doJob2(order);

        }

     

        private void doJob1(Order order) {

            doSomething(order);

        }

     

        private void doJob2(Order order) {

            doOtherThing(order);

        }

    }

    4.11 尽量不要用参数来带回方法运算结果

    比如:

    public void calculate(Order order) {

        int result = 0;

        //do lots of computing and store it in the result

        order.setResult(result);

    }

     

    public void action() {

        order = orderDao.findOrder();

        calculate(order);

        // do lots of things about order

    }

    例子中calculate方法通过传入的order对象来存储结果, 不如如下写:

    public int calculate(Order order) {

        int result = 0;

        //do lots of computing and store it in the result

        return result;

    }

    public void action() {

        order = orderDao.findOrder();

        order.setResult(calculate(order));

        // do lots of things about order

    }

    4.12    除非有相当充足的理由,否则不许使用省略泛型类的类型参数

    养成良好的编码规范,从我做起

    展开全文
  • 计算机为何可以运行Java代码

    千次阅读 多人点赞 2021-12-19 01:11:22
    Java代码有很多种不同的运行方式。比如说可以在开发工具中运行,可以双击执行jar文件运行,也可以在命令行中运行,甚至可以在网页。 这些执行方式都离不开JRE,Java运行时环境。 JRE仅包含运行Java程序的必需组件,...

    关注文末公众号,有惊喜福利!

    Java代码有很多种不同的运行方式。比如说可以在开发工具中运行,可以双击执行jar文件运行,也可以在命令行中运行,甚至可以在网页。
    这些执行方式都离不开JRE,Java运行时环境。

    JRE仅包含运行Java程序的必需组件,包括Java虚拟机以及Java核心类库等。我们Java程序员经常接触到的JDK(Java开发工具包)同样包含了JRE,并且还附带了一系列开发、诊断工具。

    然而,运行C++代码则无需额外的运行时。往往把这些代码直接编译成CPU所能理解的代码格式,即机器码。

    比如下图的中间列,就是用C语言写的Helloworld程序的编译结果。
    C程序编译而成的机器码就是一个个的字节,它们是给机器读的。那为让开发人员也能理解,用反汇编器将其转换成汇编代码(如下图的最右列所示)。

    ; 最左列是偏移;中间列是给机器读的机器码;最右列是给人读的汇编代码
    0x00:  55                    push   rbp
    0x01:  48 89 e5              mov    rbp,rsp
    0x04:  48 83 ec 10           sub    rsp,0x10
    0x08:  48 8d 3d 3b 00 00 00  lea    rdi,[rip+0x3b] 
                                        ; 加载"Hello, World!\n"
    0x0f:  c7 45 fc 00 00 00 00  mov    DWORD PTR [rbp-0x4],0x0
    0x16:  b0 00                 mov    al,0x0
    0x18:  e8 0d 00 00 00        call   0x12
                                        ; 调用printf方法
    0x1d:  31 c9                 xor    ecx,ecx
    0x1f:  89 45 f8              mov    DWORD PTR [rbp-0x8],eax
    0x22:  89 c8                 mov    eax,ecx
    0x24:  48 83 c4 10           add    rsp,0x10
    0x28:  5d                    pop    rbp
    0x29:  c3                    ret
    

    为什么Java要在虚拟机里运行?

    Java作为一门高级程序语言,它的语法非常复杂,抽象程度也很高。因此,直接在硬件上运行这种复杂的程序并不现实。所以呢,在运行Java程序之前,需要对其进行一番转换。

    转换怎么操作

    设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换成该虚拟机所能识别的指令序列,即Java字节码。
    之所以这么取名,是因为Java字节码指令的操作码(opcode)被固定为一个字节。

    下图的中间列,正是用Java写的Helloworld程序编译而成的字节码。可以看到,它与C版本的编译结果一样,都是由一个个字节组成的。
    同样可以将其反汇编为人类可读的代码格式(如下图的最右列所示)。
    Java版本的编译结果相对精简一些,Java虚拟机相对于物理机而言,抽象程度更高。

    # 最左列是偏移;中间列是给虚拟机读的机器码;最右列是给人读的代码
    0x00:  b2 00 02         getstatic java.lang.System.out
    0x03:  12 03            ldc "Hello, World!"
    0x05:  b6 00 04         invokevirtual java.io.PrintStream.println
    0x08:  b1               return
    

    Java虚拟机常见的是在各个现有平台(如Windows_x64、Linux_aarch64)上提供软件实现。一旦一个程序被转换成Java字节码,便可在不同平台上的虚拟机实现里运行,即“一次编写,到处运行”。

    虚拟机的另外一个好处是它带来托管环境(Managed Runtime),代替我们处理一些代码中冗长而且容易出错的部分。自动内存管理与垃圾回收,这部分内容甚至催生了一波垃圾回收调优。

    托管环境还提供了诸如数组越界、动态类型、安全权限等等的动态检测。

    Java虚拟机具体是怎样运行Java字节码的?

    以标准JDK中的HotSpot虚拟机为例,从虚拟机以及底层硬件两个角度,给你讲一讲Java虚拟机具体是怎么运行Java字节码的。

    虚拟机视角,执行Java代码首先要将它编译而成的class文件加载到Java虚拟机。
    加载后的Java类会被存放于方法区(Method Area)。实际运行时,虚拟机会执行方法区内的代码。

    这和段式内存管理中的代码段类似。而且,Java虚拟机同样也在内存中划分出堆和栈来存储运行时数据。

    但Java虚拟机会将栈细分为面向Java方法的Java方法栈,面向本地方法(用C++写的native方法)的本地方法栈,以及存放各个线程执行位置的PC寄存器。
    运行过程中,每当调用进入一个Java方法,Java虚拟机会在当前线程的Java方法栈中生成一个栈帧,存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且Java虚拟机不要求栈帧在内存空间里连续分布。

    当退出当前执行的方法时,不管是正常返回、异常返回,Java虚拟机均会弹出当前线程的当前栈帧,并舍弃。

    硬件视角,Java字节码无法直接执行。因此,Java虚拟机需要将字节码翻译成机器码。
    HotSpot翻译过程有两种形式:

    • 解释执行,逐条将字节码翻译成机器码并执行
      无需等待编译
    • 即时编译(Just-In-Time compilation,JIT),将一个方法中包含的所有字节码编译成机器码后再执行
      实际运行速度更快

      HotSpot默认采用混合模式,综合了解释执行和即时编译两者的优点:
      先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。

    Java虚拟机的运行效率

    HotSpot采用了多种技术来提升启动性能以及峰值性能,即时编译便是其中最重要的技术之一。

    即时编译建立在程序符合二八定律,百分之二十的代码占据了百分之八十的计算资源。

    • 对占据大部分的不常用的代码,无需耗费时间将其编译成机器码,而是采取解释执行的方式运行
    • 对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想运行速度。

    理论即时编译后的Java程序的执行效率,是可能超过C++。因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化。
    虚方法是用来实现多态性。对一个虚方法调用,尽管有很多目标方法,但实际运行过程中,可能只调用其中一个。

    这信息可被即时编译器所利用,规避虚方法调用的开销,达到比静态编译的C++程序更高的性能。

    为满足不同用户场景的需要,HotSpot内置了多个即时编译器:C1、C2和Graal。
    Graal是Java 10正式引入的实验性即时编译器。

    之所以引入多个即时编译器,为在编译时间和生成代码的执行效率之间进行取舍。C1又叫做Client编译器,面向对启动性能有要求的客户端GUI程序,采用的优化手段相对简单,因此编译时间较短。
    C2又叫做Server编译器,面向对峰值性能有要求的服务器端程序,采用的优化手段相对复杂,因此编译时间较长,但同时生成代码的执行效率较高。

    从Java 7开始,HotSpot默认采用分层编译的方式:热点方法首先会被C1编译,而后热点方法中的热点会进一步被C2编译。
    为了不干扰应用的正常运行,HotSpot的即时编译是放在额外的编译线程中进行的。HotSpot会根据CPU的数量设置编译线程的数目,并且按1:2的比例配置给C1及C2编译器。
    在计算资源充足的情况下,字节码的解释执行和即时编译可同时进行。编译完成后的机器码会在下次调用该方法时启用,以替换原本的解释执行。

    总结

    在虚拟机中运行,是因为它提供了可移植性。一旦Java代码被编译为Java字节码,便可以在不同平台上的Java虚拟机实现上运行。此外,虚拟机还提供了一个代码托管的环境,代替我们处理部分冗长而且容易出错的事务,例如内存管理。

    Java虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC寄存器、Java方法栈和本地方法栈。Java程序编译而成的class文件,需要先加载至方法区中,方能在Java虚拟机中运行。

    为了提高运行效率,标准JDK中的HotSpot虚拟机采用的是一种混合执行的策略。

    它会解释执行Java字节码,然后会将其中反复执行的热点代码,以方法为单位进行即时编译,翻译成机器码后直接运行在底层硬件之上。

    HotSpot装载了多个不同的即时编译器,以便在编译时间和生成代码的执行效率之间做取舍。

    参考

    • [1]https://en.wikipedia.org/wiki/Java_processor
    • [2]https://wiki.openjdk.java.net/display/CodeTools/asmtools

    展开全文
  • tesseract安装包及JAVA代码实例

    热门讨论 2012-05-18 00:00:09
    光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。OCR技术非常专业,一般多是印刷、打印行业的从业人员使用,可以快速的将纸质资料...
  • C# to Java 代码转换工具(已破解)

    千次下载 热门讨论 2011-04-19 06:32:03
    一个很强大的工具, 能将c#代码片段、文件甚至工程直接转换成java代码,并能彻底解决外部引用的DLL问题,最强的是支持c#工程的直接转换,生成的Java代码质量也很不错。软件已破解,去除了未注册版最多只能转换1000行的...
  • 几个简单的入门JAVA代码

    千次阅读 2021-02-12 09:07:56
    首先在配置好java环境的前提下,安装好eclipse,以下示例均在eclipse下运行,代码详解看注释一、HelloWorld示例代码:package com.hpe.java;//这是一个问好程序public class Hello {//一个类只能有一个main方法public...

    首先在配置好java环境的前提下,安装好eclipse,以下示例均在eclipse下运行,代码详解看注释

    一、HelloWorld

    示例代码:

    package com.hpe.java;

    //这是一个问好程序

    public class Hello {

    //一个类只能有一个main方法

    public static void main(String arg[]) {

    System.out.print("helloworld!");//输出不换行

    System.out.println("heng");//输出换行

    System.out.print("jadh");

    }

    }

    运行结果:

    helloworld!heng

    jadh

    二、常量测试

    示例代码:

    package com.hpe.java;

    public class Demo1 {

    /*

    * 什么是常量?就是程序运行期间,固定的值是不能改变的

    */

    public static void main(String arg[]) {

    //常量有多少种?

    //1.整数

    System.out.println(100);

    //2.小数

    System.out.println(250.250);

    //3.字符串

    System.out.println("字符");

    //4.字符

    System.out.println('我');//字符只能写一个,并且不能为空

    System.out.println("=============");

    //5.布尔:只能有两个值,要么是true要么就是false

    System.out.println(false);

    }

    }

    运行结果:

    100

    250.25

    字符

    =============

    false

    三、变量测试

    示例代码:

    package com.hpe.java;

    public class Demo2 {

    /*

    * 基本数据类型

    * 整数类型:byte short int(常用) long

    * 浮点类型:float double(默认)

    * 字符类型:char

    * 布尔类型:boolean

    * 引用类型

    * 数据类型除了8种基本数据类型,剩下的全是引用类型

    */

    public static void main(String arg[]) {

    //定义变量有两种方式

    /*

    * 第一种方式:

    * 数据类型 变量名;

    * 变量名=数据值;

    */

    byte num1;//创建了一个byte类型的变量,名称叫num1

    num1=100;//为变量赋值,把右边的常量100赋值给了左侧的变量

    System.out.println("num1="+num1);

    //改变变量num1的值

    num1=111;

    //num1=128; //byte的存储范围在-128~127,右侧进行赋值的数据不能超过左侧变量数据类型范围

    System.out.println("num1="+num1);

    /*

    * 创建变量的第二种方式

    * 数据类型 变量名=数值;创建变量的同时给变量赋值

    */

    byte num2=109;

    System.out.println("num2="+num2);

    //long类型

    long num3=3456;//如果不加l或L默认是int类型

    System.out.println("num3="+num3);

    //浮点数

    double num4=123;

    System.out.println("num4="+num4);//123.0

    float num5=1234f;//后面加上F或者f代表是float

    System.out.println("num5="+num5);//1234.0

    //字符

    char c='a';//只能是一个字符

    System.out.println("c="+c);

    //布尔类型:只能是true或者false,常用于逻辑判断

    boolean b=true;

    //基本数据类型转换

    /*

    * 小范围到大范围,自动类型转换

    */

    short s=123;

    int num=s;

    System.out.println("num="+num);

    /*

    * 强制类型转换:大范围换小范围

    */

    int i=345;

    short s1=(short)i;

    System.out.println(s1);

    }

    }

    运行结果:

    num1=100

    num1=111

    num2=109

    num3=3456

    num4=123.0

    num5=1234.0

    c=a

    num=123

    345

    展开全文
  • javaparser 作为开发人员,我们经常鄙视手动进行重复工作的人员。 我们认为, 他们应该实现这一目标 。 尽管如此,我们还是进行与... 生成我们必须编写的无聊的重复性Java代码 分析我们的代码以回答有关它...
  • WinMerge(java代码比较工具)

    热门讨论 2011-09-13 03:12:37
    WinMerge(java代码比较工具),相当好用,可以用来比较两个java代码的不同的地方,在java开发过程中给你解决寻找两个同名文件不同之处的烦恼!用法简单!
  • java代码实现word转换成pdf

    千次下载 热门讨论 2013-09-18 12:45:07
    va代码 word转pdf ,word批量转换成pdf,word单独转换成pdf,只需要调用WordToPDFUtil方法就可以实现批量或者单独转换
  • 新手编写java代码使用什么软件

    千次阅读 2021-02-12 11:06:02
    新手编写java代码常用的编辑器有:1、eclipseEclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的...
  • Python统计Java代码行数

    万次阅读 2020-05-25 23:23:44
    相信大家都用过一些工具统计自己项目中的代码量,今天,我将介绍一下如何使用Python脚本统计AndroidStudio中Java代码的行数。 # -*- coding:utf-8 -*- import os import time # 获取当前项目目录 projectDir = o.....
  • Java代码生成器

    万次阅读 2019-06-10 17:28:47
    本项目基于是基于 renren-generator 定制的代码生成器 文章目录**项目说明**不同点:效果原理分析如何定制开发?更多可能存在的坑代码地址 不同点: 因为本人的公司使用的是 tkmyabtis + swagger 构建 rest api,...
  • Java代码是怎么运行的?

    万次阅读 2018-11-06 00:52:56
    极客时间《深入拆解Java虚拟机》...Java 代码有很多种不同的运行方式,比如在开发工具中运行、双击执行 jar 文件运行、在命令行中运行,甚至可以在网页中运行。 Java 的运行离不开 JRE(Java 运行时环境), JRE ...
  • VSCode Java 代码补全插件

    万次阅读 2020-05-23 19:21:30
    新装的VSCode写一个Java文件竟然没有代码自动补全,下载了以下插件Java Extension Pack: 插件链接:https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack 安装后即可自动补全代码
  • jsp中嵌套java代码,js中嵌套java代码

    千次阅读 2019-01-10 16:24:11
    首先根据三目运算中,来...在js中想要判断是true还是false,所以需要把java代码拿过来,在js中写java代码,得加上&lt;%%&gt;,在里面写java代码   根据jsp中的java代码,取到user,在js中调用user ...
  • java代码执行顺序详解

    千次阅读 多人点赞 2019-07-15 11:15:19
    今天我们来聊一聊Java的基础:类中方法的执行顺序。 首先直接给出类代码的执行顺序 但是我们必须要注意的是: 静态代码块只执行一次,也就是说你不管创建的多少对象,静态代码只执行一次。 这是为什么啦? ...
  • java代码统计工具

    千次下载 热门讨论 2008-07-27 15:22:36
    java代码统计工具,给出一个文件路径,统计出代码的总行数,注释行数,空行行数。含可运行的jar,以及源代码。 更多请访问: http://blog.csdn.net/china8848
  • Idea中Java代码修改以后运行,代码不生效 解决 问题点: 代码提交到本地,清楚idea 缓存,重新编译也没有用。 解决:Maven clean 一可以了 。 两个Modules 所以clean 两个即可。 clean 成功之后就可以重新启动项目...
  • 程序员专属浪漫:如何用java代码画❤️

    万次阅读 多人点赞 2021-08-03 09:40:08
    我找了一下,发现方法竟然很多,我们就来见识一下,最后我们看一下如何用简单的java代码实现一个心。 一.❤️的数学背景 据说,心形线起源于法国的笛卡尔,他曾认识一位瑞典小公国的公主克里斯汀,并成为了公主的...
  • 一款上手即用的Java代码混淆工具

    千次阅读 热门讨论 2020-05-05 12:20:50
    基于Allatori的Java代码混淆 maven插件工具 项目地址:github Java代码很容易进行反编译,如果有人想要研究你的项目,随便反编译一下就看得清清楚楚了,特别像我们公司的测试人员,经常会反编译我们的项目,然后找...
  • word插入Java代码

    千次阅读 2020-04-16 01:39:11
    word插入Java代码 Syntax Highlight Code in Word Documents 选择Java生成高亮代码,复制粘贴到word。 ...
  • Java笔记——Java代码块的执行顺序

    千次阅读 2018-09-07 02:12:06
    Java代码块的执行顺序 Java程序中代码块的执行顺序对于学习Java的人来说是必不可少需要掌握的。 代码块 在Java中,使用{}括起来的代码被称为代码块。 根据其位置和声明的不同,可以分为: 局部代码块 构造...
  • ![图片说明](https://img-ask.csdn.net/upload/201902/10/1549808753_362345.png) 怎么转换为java代码。dalao帮忙

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,328,114
精华内容 2,131,245
关键字:

java代码

java 订阅
友情链接: nace_program.rar