• [新手课堂] 用java写Student类的功能
    1)编写一个Java程序片断,以定义一个表示学生的类Student。这个类的属性有“学号”、“班号”、“姓名”、“性别”、“年龄”,方法有“获得学号”、“获得班号”、“获得性别”、“获得姓名”、“获得年龄”。2)为类Student增加一个方法public String toString( ),该方法把Student类的对象的所有属性信息组合成一个字符串以便输出显示。编写一个Java Application程序,创建Student类的对象,并验证新增加的功能。 package xin;import java.util.Scanner;public class Student {    int number;    String classnumber;    int age;    String name;    String sex;       Student(int x,String y,int z,String p){     number = x;     classnumber = y;     age = z;     name = p;    }     int getNumber() {     return number;  //返回学号    }     String getSClassnumber() {     return classnumber;  //返回班号    }     int getAge() {     return age;     //返回年龄    }     String getName() {      return name;    //返回姓名     }     String getSex() {      return sex;   //返回性别     }    public String toString() {      return "学号:"+number+" 班号:"+classnumber+" 姓名:"+name+" 性别:"+sex+" 年龄:"+age;    }   public static void main(String args[]) {   boolean boo,a;   int number1,age1;   String classnumber1,st;   String name1,sex1;   Student stu = new Student(1,"s",1,"xaio");   Scanner reader = new Scanner(System.in);   System.out.println("请输入学号、班号、姓名、性别、年龄:");   stu.number = reader.nextInt();   stu.classnumber = reader.next();   stu.name = reader.next();   stu.sex = reader.next();   stu.age = reader.nextInt();   st = stu.toString();   System.out.println(st);   System.out.println("是否修改该学生信息?");   System.out.println("如果修改则输入true,反之false");    a = reader.nextBoolean();    if(a) {   System.out.println("请输入学号、班号、姓名、性别、年龄:");   number1 = reader.nextInt();   classnumber1 = reader.next();   name1 = reader.next();   sex1 = reader.next();   age1 = reader.nextInt();       System.out.println("学号:"+number1+" 班号:"+classnumber1+     " 姓名:"+name1+" 性别:"+sex1+" 年龄:"+age1);   }   else   {System.out.println("继续执行下一步");}      System.out.println("输入true继续,false退出");        boo = reader.nextBoolean();     System.out.println("*********************");      if(boo) {       main(args);   //函数调用      }      else       System.out.println("程序无法执行!!!!");   }}
  • [技术干货] 新手小白学JAVA 面向对象之多态[转载]
    1. 概念多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。比如,你的女盆友让你买点水果回来,不管买回来的是苹果还是西瓜,只要是水果就行,这个就是生活中多态的体现再比如,小猫、小狗、小猪我们可以把他们都归纳成小动物,每种小动物都需要吃东西,所以我们可以统一设置他们都必须吃,但是每种小动物的习性不一样,那这个就可以设置成小动物自己特有的功能,多态对象只能调用父类中定义子类中重写的功能,并不能调用子类的特有功能,这样就实现了代码的统一2 . 特点多态的前提1:是继承多态的前提2:要有方法的重写父类引用指向子类对象,如:Animal a = new Cat();多态中,编译看左边,运行看右边3. 练习:多态入门案例创建包: cn.tedu.oop创建类: TestDemo.javapackage cn.tedu.oop2;/*本类用作多态的入门案例*/public class TestDemo {    public static void main(String[] args) {        //6.创建“纯纯的”对象用于测试        Animal a = new Animal();        Cat c = new Cat();        Dog d = new Dog();        a.eat();//小动物Animal吃啥都行~调用的是父类自己的功能        c.eat();//小猫爱吃小鱼干~调用的是子类重写后的功能        d.eat();//小狗爱吃肉骨头~调用的是子类重写后的功能        /*2.父类对象不可以使用子类的特有功能*/        //a.jump();//报错,Animal类里并没有这个方法        //a.run();//报错,Animal类里并没有这个方法        c.jump();//小猫Cat跳的老高啦~,子类可以调用自己的功能        d.run();//小狗Dog跑的老快啦~,子类可以调用自己的功能        //7.创建多态对象进行测试        /*3.口诀1:父类引用指向子类对象        * 解释:创建出来的子类对象的地址值,交给父类类型的引用类型变量来保存*/        Animal a2 = new Cat();//Cat类对象的地址值交给父类型变量a2来保存        Animal a3 = new Dog();//Dog类对象的地址值交给父类型变量a3来保存        //8.测试多态对象        /*4.口诀2:编译看左边,运行看右边        * 解释:必须要在父类定义这个方法,才能通过编译,把多态对象看作是父类类型        *      必须要在子类重写这个方法,才能满足多态,实际干活的是子类*/        a2.eat();//小猫爱吃小鱼干~,多态对象使用的是父类的定义,子类的方法体    }}/*1.多态的前提:继承+重写*///1.创建父类class Animal{    //3.创建父类的普通方法    public void eat(){        System.out.println("小动物Animal吃啥都行~");    }}//2.1创建子类1class Cat extends Animal{    //4.1添加重写的方法    public void eat(){        System.out.println("小猫爱吃小鱼干~");    }    //5.1添加子类的特有功能    public void jump(){        System.out.println("小猫Cat跳的老高啦~");    }}//2.2创建子类2class Dog extends Animal{    //4.2添加重写的方法    @Override    public void eat(){        System.out.println("小狗爱吃肉骨头~");    }    //5.2添加子类的特有功能    public void run(){        System.out.println("小狗Dog跑的老快啦~");    }}4. 多态的好处多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法提高了程序的可扩展性和可维护性5. 多态的使用前提:多态对象把自己看做是父类类型成员变量: 使用的是父类的成员方法: 由于存在重写现象,所以使用的是子类的静态成员: 随着类的加载而加载,谁调用就返回谁的6. 练习:多态成员使用测试创建包: cn.tedu.oop创建类: TestDemo2.javapackage cn.tedu.oop2;/*本类用于测试多态成员的使用情况*/public class TestDemo2 {    public static void main(String[] args) {        //7.创建纯纯的子类对象        Dog2 d = new Dog2();        System.out.println(d.sum);//20,子类自己的属性        d.eat();//小狗爱吃肉包子,子类自己的方法        //8.创建多态对象        /*口诀1:父类引用指向子类对象*/        /*口诀2:编译(保存)看左边,运行(效果)看右边*/        Animal2 a = new Dog2();        /*多态中,成员变量使用的是父类的*/        System.out.println(a.sum);//10        /*多态中,方法的声明使用的是父类的,方法体使用的是子类的*/        a.eat();//小狗爱吃肉包子        /*多态中,调用的静态方法是父类的,因为多态对象把自己看作是父类类型        * 直接使用父类中的静态资源*/        a.play();//没有提示,玩啥都行~        Animal2.play();    }}//1.创建父类class Animal2{    //3.创建父类的成员变量    int sum = 10;    //4.创建父类的普通方法    public void eat(){        System.out.println("吃啥都行~");    }    //9.1定义父类的静态方法play    public static void play(){        System.out.println("玩啥都行~");    }}//2.创建子类class Dog2 extends Animal2{    //5.定义子类的成员变量    int sum = 20;    //6.重写父类的方法    @Override    public void eat(){        System.out.println("小狗爱吃肉包子");    }    //9.2创建子类的静态方法play    //@Override    /*这不是一个重写的方法,只是恰巧在两个类中出现了一模一样的两个静态方法    * 静态方法属于类资源,只有一份,不存在重写的现象    * 在哪个类里定义,就作为哪个类的资源使用*/    public static void play(){        System.out.println("小狗喜欢玩皮球~");    }}7 拓展7.1 设计汽车综合案例创建包: cn.tedu.oopexec创建类: DesignCar.javapackage cn.tedu.oop2;/*本类用于完成汽车设计案例*/public class DesignCar {    public static void main(String[] args) {        //9.创建一个纯纯的父类对象进行测试        Car c = new Car();        System.out.println(c.getColor());//null        c.start();        c.stop();        //c.swim();//报错,父类对象不可以调用子类的特有功能        //10.创建纯纯的子类对象做测试        BMW b = new BMW();        System.out.println(b.color);//五彩斑斓的黑        System.out.println(b.getColor());//null        b.start();//都让开,我的车要起飞啦~        b.stop();//唉呀妈呀熄火了~        //11.创建多态对象进行测试        Car c2 = new TSL();        //System.out.println(c2.color);        System.out.println(c2.getColor());        c2.stop();        c2.start();        //c2.swim();    }}//1.通过分析,抽象形成一个汽车类class Car{    //2.定义并封装汽车类的属性--成员变量    private String brand;//品牌    private String color;//颜色    private int id;//编号    private double price;//价格    //3.定义功能    public void start(){        System.out.println("我的小车车启动啦~");    }    public void stop(){        System.out.println("唉呀妈呀熄火了~");    }    public String getBrand() {        return brand;    }    public void setBrand(String brand) {        this.brand = brand;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }}//4.创建子类class BMW extends Car{    String color = "五彩斑斓的黑";    //5.重写父类的方法    @Override    public void start(){        System.out.println("都让开,我的车要起飞啦~");    }}//6.创建子类2class TSL extends Car{    //7.重写父类的方法    @Override    public void stop(){        System.out.println("唉呀妈,怎么停不下来呢");    }    //8.添加子类的特有功能    public void swim(){        System.out.println("没想到吧,我还是个潜水艇");    }}7.2 多态为了统一调用标准package cn.tedu.oop2;public class TestFruit {    public static void main(String[] args) {        Fruit f = new Fruit();        Apple a = new Apple();        Orange o = new Orange();        get(f);        get(a);        get(o);    }    //只需要创建一个方法,就可以执行截然不同的效果    //忽略子类对象的差异统一看作父类类型    public static void get(Fruit f){        f.clean();    }}class Fruit{    public void clean(){        System.out.println("水果要洗洗再吃");    }}class Apple extends Fruit{    @Override    public void clean(){        System.out.println("苹果需要削皮");    }}class Orange extends Fruit{    @Override    public void clean(){        System.out.println("橙子需要剥皮");    }}7.3 静态变量和实例变量的区别在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。7.4 向上转型和向下转型在JAVA中,继承是一个重要的特征,通过extends关键字,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。那么在这个过程中就存在着多态的应用。存在着两种转型方式,分别是:向上转型和向下转型。向上转型:可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。比如:父类Parent,子类Child父类的引用指向子类对象:Parent p=new Child();说明:向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类中声明过的方法,方法体执行的就是子类重过后的功能。但是此时对象是把自己看做是父类类型的,所以其他资源使用的还是父类型的。比如:花木兰替父从军,大家都把花木兰看做她爸,但是实际从军的是花木兰,而且,花木兰只能做她爸能做的事,在军营里是不可以化妆的。向下转型(较少):子类的引用的指向子类对象,过程中必须要采取到强制转型。这个是之前向上造型过的子类对象仍然想执行子类的特有功能,所以需要重新恢复成子类对象Parent p = new Child();//向上转型,此时,p是Parent类型Child c = (Child)p;//此时,把Parent类型的p转成小类型Child其实,相当于创建了一个子类对象一样,可以用父类的,也可以用自己的说明:向下转型时,是为了方便使用子类的特殊方法,也就是说当子类方法做了功能拓展,就可以直接使用子类功能。比如:花木兰打仗结束,就不需要再看做是她爸了,就可以”对镜贴花黄”了————————————————版权声明:本文为CSDN博主「程序媛 泡泡」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_43884234/article/details/116593803
  • [沙箱纠错] 使用Java开发数据仓库服务GaussDB(DWS)_步骤
    离谱呀  镜像的权限都没有,我玩个蛇皮
  • [技术干货] 人工智能五种开发语言对比,选择哪个更好呢?
    作者:爱Code人工智能已经在我们的生活之中随处可见,这个也主要是由于他在不同的环境,场景面对多变的需求通过单一或复合的方案,算法可以帮助我们解决问题。在我国人工智能在这几年发展势头强劲,像人脸识别,医学等多个领域我们有着不错的成绩。但除了对硬件像GPU有着更高的要求之外,对于程序人员的开发能着也日渐提高,如何选择一个合适的开发语言也更是重中之种。人工智能已经在我们的生活之中随处可见,这个也主要是由于他在不同的环境,场景面对多变的需求通过单一或复合的方案,算法可以帮助我们解决问题。过去几年身边不同朋友都在说#人工智能#。我们都是软件开发人员,同时我们也感觉到,开发语言的转变,使得人工智能向前发展。人工智能,的崛起对程序员的要求也随之变的要求更高,需要量也是大涨。早期我记得时一个差不多的人工智能工程师,在北京能达到30K左右。面对人员招聘时,他们说了一些人工智能专门的开发语言,可能是小编好久不看书的原因,只是 假装镇定,同时也感觉到了自己的不足。下边说下常用的人工智能程序开发语言的特点。PythonPython 是1991年发布出来的,如果不是这几年的人工智能,恐怕啥时候能达到现在比较受欢迎的开发语言还要等一段时间。现在59%的人工智能软件开发工程师,都在用这种开发语言。而不是选择性能天下第一的C++。我想有以下几点原因:简单容易上手,利于传播Phthoe 定位于人工智能开发语言大量的算法类库易于开发,提升开发速度,节省开发成本。与JAVA完美结合,有着 JAVA这个大咖在后边助手,顺风顺水LISPLISP是Fortan后边的最好的语言,但由于是1958年开发出来用于人工智能的,经过现代科技的迭代已经稍有落后。LISP有着一些小缺陷,更多是用于用逻辑运算等方面。但他是早期定位人工智能,所以也应该有它一席之地。R语言R语言相对LISP发布晚一点在1995年进行发布。实际上是对S语言的另一种升级。主要用于生成统计系统、数据分析系统、R语言有着 比较高的运行效率,使得他在一定日期之内是一个王者的存在。对Gmodels、RODBC、OneR、Tm 有着不错的支持。多种方案的结合能解决复杂的问题。C++C语言呢,第一次接触还是 客户的奇葩需求,要求解压即可用。不允许装系统插件。当时果断的选择了C++。如果要论处理速度,性能这方面 C++绝对是 强者中的强者。特别是对于人工智能需较高的运行速度。但由于C++的相关类库比较少,而且语法复杂,在一些小型公司上并不会使用,成本太高了。但他 对OPENCV等方面有着强悍的支持。JAVAJAVA是一个随鼐划进代的开发语言,早期的开源思要想,促进大量的开源框架的生成 。与其说是在写JAVA语言,不如说是在学习各种框架以及在理解大师们的思想之后成长。但对于AI来说,JAVA就有一点不足,他敢是用VM虚拟技术,在处理速度上成为了 一个难以处理的短板。总结对于人工智能的项目来说,以上列出的是最好的5种开发语言。只能方便你根据自身的情况,在选择开发语言时有一个参考。其实会一门语言之后其它的也很容易上手。我也希望祖国的人工智能能有着很不错的发展,让我们的祖国成为真正的科技强国。让漂亮国也学会什么叫尊重。责任编辑:华轩   来源: 今日头条
  • [业务动态] 关于《GaussDB入门级开发者认证-Java》等3个开发者认证正式上线通知
    尊敬的客户:您好!为帮助您深入了解华为云产品,探索新的技术场景,我们非常高兴地与您分享一个好消息:为了更好地服务千万开发者,华为云推出开发者认证,真正让开发者在云上作业,懂开发会开发,与开发者共成长。由华为资深研发团队精心打磨,潜心研发的《GaussDB入门级开发者认证-Java》、《华为云云原生工作级开发者认证-基础设施》、《数据仓库工作级开发者认证》于2022年6月30日正式上线!届时请进入华为云开发者学堂-开发者认证查看产品详情,体验使用,我们非常期待您的宝贵建议。以下为该开发者认证详情,您可提前了解:产品名称: 《GaussDB入门级开发者认证-Java》适合人群: 高校学生、开发工程师等;培训方案: 基础技能+综合实践,培训华为云云数据库服务能力及技能;技术能力: 掌握数据库原理、数据库SQL语言、基于高斯数据库的Java编程实操及云上开发实践能力;认证价值: 通过理论结合实践,使软件开发相关从业者具备数据库基础的理论知识和实操能力。产品名称: 《华为云云原生工作级开发者认证-基础设施》适合人群: 开发工程师、运维工程师、架构师等;培训方案: 云原生关键基础设施能力及华为云相关服务的增强特性;技术能力: 熟练掌握应用容器化改造、服务网格、多集群等云原生核心基础设施理论及云上实践能力 ;认证价值: 通过理论结合实践,使云原生相关从业者深入理解关键理论提升工作场景下的实践能力。产品名称: 《数据仓库工作级开发者认证》适合人群: 数仓工程师、架构师、数仓平台开发和管理人员、对数仓技术感兴趣的爱好者;培训方案: 通过对GaussDB(DWS)的深入解析完成对数据仓库的开发运维及数据分析实践;技术能力: 掌握GaussDB(DWS)的数据库设计、SQL开发与优化、应用开发、安全设计、集群及运维管理能力;认证价值: 通过理论结合实践,使GaussDB(DWS)从业者具备数据库开发运维和数据分析能力。届时我们还将开展相关开发者认证上新活动,详情请关注华为云开发者学堂论坛-热门活动 相关通知。发布日期:2022年6月30日
  • [技术干货] 什么是GO类型系统
    类型系统是一门编程语言的地基,它的地位至关重要。顾名思义,类型系统是指一个语言的类型体系结构。一个典型的类型系统通常包含如下基本内容: 基础类型,如byte、int、bool、float等; 复合类型,如数组、结构体、指针等; 可以指向任意对象的类型(Any类型); 值语义和引用语义; 面向对象,即所有具备面向对象特征(比如成员方法)的类型; 接口。 类型系统描述的是这些内容在一个语言中如何被关联。因为Java语言自诞生以来被称为 纯正的面向对象语言,所以我们就先以Java语言为例讲一讲类型系统。在Java语言中,存在两套完全独立的类型系统:一套是值类型系统,主要是基本类型,如byte、 int、boolean、char、double等,这些类型基于值语义;一套是以Object类型为根的对象类型系统,这些类型可以定义成员变量和成员方法,可以有虚函数,基于引用语义,只允许在堆上创建(通过使用关键字new)。Java语言中的Any类型就是整个对象类型系统的根——java.lang.Object类型,只有对象类型系统中的实例才可以被Any类型引用。值类型想要被Any类型引用,需要装箱                                                                                                                                  2 (boxing)过程,比如int类型需要装箱成为Integer类型。另外,只有对象类型系统中的类型才可以实现接口,具体方法是让该类型从要实现的接口继承。 相比之下,Go语言中的大多数类型都是值语义,并且都可以包含对应的操作方法。在需要的时候,你可以给任何类型(包括内置类型)“增加”新方法。而在实现某个接口时,无需从该接口继承(事实上,Go语言根本就不支持面向对象思想中的继承语法),只需要实现该接口要求的所有方法即可。任何类型都可以被Any类型引用。Any类型就是空接口,即interface{}。
  • [使用说明] CodeArts常见问题
    Java SmartAssist开发套件常用设置      语言服务启动成功后,设置弹窗中会出现Java SmartAssist开发套件的设置,即语言服务相关的所有设置,包含Java功能相关的设置、Maven及Gradle相关的设置和Validation设置。Maven相关设置1.什么是Bundled(Maven 3)?       Maven home默认版本为Bundled(Maven 3),即CodeArts预安装的Maven,版本为3.6.3,同时会兼容maven2。2.如何修改Maven home?       Maven home配置中,您可以选择自带的Bundled Maven版本或已解析的系统变量(如MAVEN_HOME),也可以指定安装在计算机上的其他Maven版本。同时,CodeArts还支持手动输入目录或点击browse按钮并在打开的对话框中选择所需的目录。3.如何指定User settings file?       用户特定配置的文件,默认读取%HomePath%\.m2目录下的settings.xml文件。如果您需要指定另一个文件,请手动输入文件目录或点击browse按钮并在打开的对话框中选择所需的文件。4.如何指定Local repository?       Local repository默认的本地仓库路径为%HomePath%\.m2\repository,该目录存储下载配置文件。如果您需要指定另一个目录,请手动输入目录或点击browse按钮并在打开的对话框中选择所需的路径。5.如何设置Maven SDK?        默认为Project JDK,您可以点击下拉框选择其它版本的JDK(CodeArts会自动识别本地已安装的JDK)。6.Work offline的作用是什么?        如果选中此复选框,Maven 将在离线模式下工作,并且仅使用本地可用的资源。7.Print exception stack trace的作用是什么?        如果选中此复选框,则会生成异常堆栈跟踪。8.Use plugin registry的作用是什么?        如果选中此复选框,以启用对 Maven 的插件注册表的引用。9.Excute goals recursively的作用是什么?        如果选中此复选框,则将构建递归到嵌套项目中。Gradle相关设置1.什么是Gradle User Home?        Gradle User Home 用于存储全局配置属性和初始化脚本以及缓存、日志文件等。默认设置路径为%HomePath%/.gradle。2.可以修改Gradle User Home吗?        可以通过以下方式之一覆盖默认路径:您可以设置GRADLE_USER_HOME环境变量(例如,%APPDATA%/.gradle)。变量的值是自动获取的,新路径自动显示在Gradle User Home设置里。您可以手动指定位置:手动输入目录或点击browse按钮并在打开的对话框中选择所需的目录。3.如何设置Gradle SDK?        默认为Project JDK,您可以点击下拉框选择其它版本的JDK(CodeArts会自动识别本地已安装的JDK)。其他语言服务相关设置1.Project SDK默认是哪个版本?        如果JDK已安装在您的计算机上,项目初始化时,默认选择最高的JDK版本。2.Language level是什么?        Language level定义了编辑器提供的编码辅助功能。Language level可以与Project SDK 不同。例如,您可以使用 JDK 11并将Language level设置为 8。这使得字节码与 Java 8 兼容,同时检查确保您不使用 Java 11 中的constructs。CodeArts运行和调试常见问题1.如何在运行主类main方法前配置更多的运行参数?        CodeArts支持配置更多的运行参数来调试程序,点击右上角调试工具栏default选择Edit,在属性对话框中添加和修改,目前已支持配置主类、命令行参数、环境变量、JVM配置参数及缩短运行命令行配置,将来我们会有更多的支持。2.如何启动多个调试?        CodeArts暂不支持并行运行和调试,新启动一个调试的时候会提示是否结束已启动的调试进程并启动当前的调试。Maven下载依赖代理问题1、CodeArts设置的代理和Maven的settings.xml中的代理相比,哪个优先级更高?        CodeArts设置的代理优先级更高。Maven的settings.xml中的代理配置如下图:2、如果下载依赖,报407状态码错误,该如何处理?        当代理设置在配置文件settings.xml中时,需要在settings.xml中配置username和password。        当代理设置在CodeArts的设置项中时,在设置中搜索proxy,找到proxy Username和proxy Password设置项,并进行相应的配置。 Gradle下载依赖代理问题1、下载Gradle的zip包时怎么配置代理?        在CodeArts设置中配置代理即可。Gradle工程自动下载gradle/wrapper/gradle-wrapper.properties文件的distributionUrl的zip包,需要提前配置好CodeArts设置代理2、CodeArts设置的代理和Gradle的gradle.properties中的代理相比,哪个优先级更高?       CodeArts设置的代理优先级更高。Gradle的gradle.properties中的填写代理信息,如下图:CodeArts登录激活CodeArts登录激活会走CodeArts代理配置吗?当CodeArts设置配置代理时,在登录激活时会生效。华为云API开发常见问题1、如何解决证书问题?       在使用华为云API开发时,遇到如下报错时,即为jdk证书问题引起。解决办法:1>代码中忽略ssl校验        参考代码:        HttpConfig config = HttpConfig.getDefaultHttpConfig();        config.withIgnoreSSLVerification(true);2>jdk导入代理服务器证书或者代理服务器的所有父级证书       方法步骤(以华为证书为例):       (1)、请用windows自带的cmd窗口,且使用管理员方式       (2)、安装命令: cd /d %JAVA_HOME%\jre\lib\security curl https://cmc-szver-artifactory.cmc.tools.huawei.com/artifactory/CMC-Release/certificates/HuaweiITRootCA.cer -o HuaweiITRootCA.cer curl https://cmc-szver-artifactory.cmc.tools.huawei.com/artifactory/CMC-Release/certificates/HWITEnterpriseCA1.cer -o HWITEnterpriseCA1.cer keytool -keystore cacerts -importcert -alias HuaweiITRootCA -file HuaweiITRootCA.cer -storepass changeit -noprompt keytool -keystore cacerts -importcert -alias HWITEnterpriseCA1 -file HWITEnterpriseCA1.cer -storepass changeit -noprompt(3)、检验:         声明:findstr命令执行后会有返回值 cd /d %JAVA_HOME%\jre\lib\security keytool -list -V  -keystore cacerts -storepass changeit | findstr /n  huaweiitrootca keytool -list -V  -keystore cacerts -storepass changeit | findstr /n  hwitenterpriseca1(4)、清楚冗余: del  HuaweiITRootCA.cer del  HWITEnterpriseCA1.cer2、如何使用临时AK/SK调用华为云API        在使用华为云API开发时,华为云API插件提供的补全模板往往是使用永久AK/SK进行调用,代码如下:        如果使用临时AK/SK,相比于永久AK/SK多一个x-security-token参数,我们只需要在创建credentials的时候使用withSecurityToken()方法即可,参考如下代码:
  • [技术干货] 我们与Java的不解之缘---Java27岁生日快乐[转载]
    前言:直至今日,距离Java语言的产生以及有27年了。也许我们陪伴Java的时间可能仅有三四年,甚至仅有一两年,但是她在我们心中的地位是至高无上的。从第一个“hello world”开始,我们就与Java结下了不解之缘,这也意味着我们要与她“结伴一生”。因此,在Java这个特殊的27岁,小威将与各位小伙伴儿一起经历Java的发展之路以及今后对Java的学习。在这里,先谢谢各位小伙伴儿的支持了嘿嘿文章目录Java语言的特点Java语言的发展史Java框架及云原生个人用Java做过的小项目Java语言的特点Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。简单性:Java语言继承了C++语言的优点,去掉了C++中学习起来比较难的多继承、指针等概念,所以Java语言学习起来更简单,使用起来也更方便。面向对象:Java是一种面向对象的编程语言。分布性:Java设计成支持在网络上应用,它是分布式语言。所以只要用Java编写了一个程序,就可以到处应用。可以节省大量人力物力。编译和解释性:Java编译程序生成字节码,而不是通常的机器码,这使得Java开发程序比用其他语言开发程序快很多。稳健性:Java刚开始被设计出来就是为了写高可靠和稳健的软件的。所以用Java写可靠的软件很容易。目前许多第三方交易系统、银行平台的前台和后台电子交易系统等都会用Java语言开发。安全性:Java的存储分配模型是它防御恶意代码的主要方法之一。所以很多大型企业级项目开发都会选择用Java开发。可移植性:Java并不依赖平台,用Java编写的程序可以运用到任何操作系统上。高性能:Java是一种先编译后解释的语言,所以它不如全编译性语言快。但Java设计者制作了“及时”编译程序,这样就可以实现全编译了。多线索性:Java是多线索语言,它可以同时执行多个程序,能处理不同任务。动态性:Java语言设计成适应于变化的环境,它是一个动态的语言。Java语言的发展史1995年,Sun公司推出了Java,但只是一种语言,还没有一个强大的开发类库;1996年,第一个JDK1.0的发布(包括运行环境JRE和开发环境JDK);1997年2月,SUN公司紧接着推出了JDK 1.1;1998年12月8日,JDK1.2——第二代Java平台的企业版J2EE发布;1999年6月,Java第二代平台2.0发布,并且Sun公司把Java体系分为三个方向:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器;注意:Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及。2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发布,都大幅度的提高了Java的性能;2002年2月26日,J2SE1.4发布;2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0;2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2(Java6最经典,流传最久的版本)。如下所示:J2EE更名为JavaEEJ2SE更名为JavaSEJ2ME更名为JavaME2009年,Oracle收购Sun公司,每半年更新一次;2014年,JavaSE8.0发布,企业级开发。Java框架及云原生随着Java的发展,开发Java程序也变得越来越简单,Java框架也慢慢地流行了起来。我们学了Java基础,就要开始Java框架的学习了。那么,Java的框架主要有哪些呢?Java框架主要有:轻量级且开源的Spring,WEB界面SpringMVC,数据库持久化的MyBatis,SpringBoot,SpringCloud,jQuery,Netty,Log4j,Quartz,Redis,RabbitMQ等等。学过了Java基础的小伙伴儿们可以开始Java框架的学习了。下面介绍一下云原生Java和云原生有着很密集的联系,以后我们Java工程师也会朝着云原生发展。云原生是基于分布部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系。云原生应用也就是面向“云”而设计的应用,在使用云原生技术后,开发者无需考虑底层的技术实现,可以充分发挥云平台的弹性和分布式优势,实现快速部署、按需伸缩、不停机交付等。个人用Java做过的小项目在之前的Java学习中,自己大一的时候也曾做过几个小项目和小游戏,之前做完了保存了下来,今天就来分享给大家。用Map集合写的考试系统package java小项目;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Random;import java.util.Scanner;import java.util.Set;public class 考试系统 {    public static void main(String[] args) {        // TODO 自动生成的方法存根        ArrayList <String>arr=new ArrayList<>();        ArrayList <Integer>arrl=new ArrayList();//存题号用,防止有重复题        String [][] a=new String[10][6];        HashMap <Integer,String>hm=new HashMap<>();                hm.put(0,"公共厕所()一国家首都:\n"+"A:美国\n"+"B:英国\n"+"C:中国\n"+"D:伦敦");        arr.add("D");        hm.put(1,"用什么拖地最干净:\n"+"A:拖把\n" +"B:扫帚\n"+"C:铲斗\n"+"D:用力");        arr.add("D");        hm.put(2,"老王的头发已经掉光了,为什么还一直去理发?\n"+"A:他有洁癖\n"+"B:他是理发师\n"+"C:他讲究男人的风度\n"+"D:他好久没洗头了");        arr.add("B");        hm.put(3,"失败为成功之母,那么成功为失败的什么?\n"+"A:之父\n" +"B:反义词\n"+"C:之儿\n"+"D:之母");        arr.add("B");        hm.put(4,"小白加小白等于什么?\n"+"A:小白俩\n" +"B:俩小白\n"+"C:大灰狼\n"+"D:小白兔");        arr.add("D");        hm.put(5,"历史上那个人物跑得最快?\n"+"A:曹操\n" +"B:刘备\n"+"C:诸葛亮\n"+"D:关羽");        arr.add("A");                hm.put(6,"蚊子咬在什么地方你不会觉得痒?\n"+"A:脚上\n" +"B:腿毛上\n"+"C:别人身上\n"+"D:背上");        arr.add("C");                hm.put(7,"汽车在右转弯时,哪个轮胎不转?\n"+"A:前轮胎\n" +"B:后轮胎\n"+"C:左轮胎\n"+"D:备用轮胎");        arr.add("D");        hm.put(8,"什么光会给人们带来痛苦?\n"+"A:黑光\n" +"B:暗光\n"+"C:强光\n"+"D:耳光");        arr.add("D");        hm.put(9,"什么情况下人会有两双眼睛?\n"+"A:睡觉的时候\n" +"B:变异的时候\n"+"C:两个人的时候\n"+"D:吃饭的时候");        arr.add("C");        int daxunhuan=0;        int kaoshi=0;//考试结束条件        while(daxunhuan!=999){        System.out.println("--------------------------------------");        System.out.println("单选题:");        System.out.println("--------------------------------------");        System.out.println("1:考试;      2:试题管理;      3:退出。");        System.out.println("     (请输入操作的代码1,2或3)"   );        Random r=new Random();        Scanner s=new Scanner(System.in);        int c=s.nextInt();        switch(c){        case 1:while(kaoshi!=888){            System.out.println("请问要答几道题");//要答e道题            int e=s.nextInt();            double f=100.0/e;//f为每一道题占多少分            int g=r.nextInt(10);            arrl.add(g);            for(int i=1;i<e;i++){                int h=r.nextInt(10);                if(arrl.contains(h)){                    i--;                }                else{                    arrl.add(h);                }                            }            int j=1;//j记录题号            int x=0;//x表示正确的题数,y反之            int y=0;            double sum=0;                for(Integer it:arrl){                    System.out.println("第"+j+"题");                    System.out.println(hm.get(it));                    System.out.println("请输入您的答案:");                    String str=s.next();                    j++;                    if(str.equals(arr.get(it))){                        sum+=f;                        x++;                        System.out.println("恭喜你,这道题答对了!");                    }                    else{                        y++;                        System.out.println("很抱歉,这道题你答错了!");                    }                }                System.out.println("您的得分是:"+sum);                System.out.println("正确的有"+x+"道");                System.out.println("错误的有"+y+"道");                if(sum>=60){                    System.out.println("恭喜你,成绩合格,请问还想继续答题吗?");                }                else{                    System.out.println("别学了,重开吧!");                }                System.out.println("-------------------------------");                System.out.println("若想退出考试请输入888,不想退出输入其他字符");                int k=s.nextInt();                kaoshi=k;                System.out.println("若想退出用户操作界面请输入999,若不想请随意输入");                int kk=s.nextInt();                daxunhuan=kk;                if(kk==999){                    System.out.println("您已成功退出用户操作界面!");                }            }        break;        case 2:System.out.println("-------------------------------");        System.out.println("试题管理:");        System.out.println("11,添加试题;  22,删除试题;  33,修改试题;  44,查找试题;  55,遍历试题。");        System.out.println("请输入您想操作的编号");        int l=s.nextInt();        switch(l){          case 11:System.out.println("请问您想添加几道题");        int m=s.nextInt();        int n=arr.size();        for(int w=n;w<=m+n-1;w++){            System.out.println("请添加题目:");                        String str=s.next();            hm.put(w, str);            System.out.println("请添加本题答案:");            String str2=s.next();            arr.add(str2);        }        System.out.println("您的题目已增加完毕");            break;         case 22:  System.out.println("请问要删除第几道题?");         int tishu=arr.size();         int p=s.nextInt();         arr.remove(p-1);         System.out.println("已删除答案!");         hm.remove(p-1);         for(int i=p;i<tishu;i++){             String str1=hm.get(i);                        hm.put(i-1, str1);              }         System.out.println("-------------------------------");         System.out.println("已删除试题!");         break;         case 33:System.out.println("-------------------------------");         System.out.println("请问要修改第几道题?");         int xiugai=s.nextInt();         System.out.println("-------------------------------");         System.out.println("您选择修改第"+xiugai+"道题,请修改题目:");         String str=s.next();         hm.put(xiugai-1, str);         System.out.println("题目修改完毕");         System.out.println("===============================");         System.out.println("请修改答案");         String str3=s.next();         arr.set(xiugai-1, str3);         System.out.println("答案修改完毕!");         break;         case 44:System.out.println("请问要查询第几题?");         int z=s.nextInt();         System.out.println("该题题目为:");         System.out.println(hm.get(z-1));         System.out.println("该题答案为:");                  System.out.println(arr.get(z-1));         System.out.println("-------------------------------");        break;         case 55:int jj=0;             Set set=hm.entrySet();         Iterator it =set.iterator();         while(it.hasNext()){             Map.Entry me=(Map.Entry)(it.next());             int ii=(int) (me.getKey());            jj=ii+1;             System.out.println("第"+jj+"题题目:");             System.out.println(me.getValue());             System.out.println("第"+jj+"题答案:");             System.out.println(arr.get(ii));             System.out.println("-------------------------------");         }         break;         default : daxunhuan=999;         System.out.println("您的输入有错误,已退出,请重开!");         break;        }//5选1括号        break;        case 3:System.out.println("若想退出请输入999");            int xx=s.nextInt();             daxunhuan=xx;             System.out.println("您已退出!");             break;               }//3选一括号            }//daxunhuan括号                }        }文章到这里就结束了,如果文章有什么需要改进的地方,还请大佬指正制作不用,感谢各位小伙伴儿们的支持小威在这里谢谢大家✨✨✨最后,各位陪伴了Java多少年了呢,可以在评论区里互相交流哟————————————————版权声明:本文为CSDN博主「小威要向诸佬学习呀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_53847859/article/details/125012673
  • [其他] 浅谈python和java的区别
    1、java的商业化公司支持多,如sap,oracle,ibm等,有商业化的容器,中间件,企业框架ejb。python的开源组织支持多,如qt,linux,google,很多开源程序都支持python, 如pyqt,redis,spark等。2、java主要用于商业逻辑强的领域,如商城系统,erp,oa,金融,保险等传统数据库事务领域,通过类似ssh框架事务代码,对商业数据库,如oralce,db2,sql server等支持较好,软件工程理念较强,适合软件工程式的多人开发模式。python主要用于web数据分析,科学计算,金融分析,信号分析,图像算法,数学计算,统计分析,算法建模,服务器运维,自动化操作,快速开发理念强,适合快速开发团队或个人敏捷模式。3、python有很多虚拟机实现,如cython,Pyston,pypy,jython, IronPython等等,适合用于业务语言,或插件语言,或面向领域语言,而java因为虚拟机巨大,很少用于插件语言,发布也不方便。4、python虚拟机没有java强,java虚拟机是java的核心,python的核心是可以很方便地使用c语言函数或c++库。5、python是全动态性的,可以在运行时自己修改自己的代码,java只能通过变通方法实现。python的变量是动态的,而java的变量是静态的,需要事先声明,所以java ide的代码提示功能优于python ide。6,python的产生几十年了,几十年前面向过程是主流,所以用python有好多程序用的是面向过程设计方法,很多概念从c语言过来的,class在python中是后加入的,而java是为了实现没有指针的c++(当年com组件用的引用记数,java用的虚拟机),主要采用面向对象的设计方法,很多概念是oop的概念。面向过程,相对简洁直观,但容易设计出面条程序,面向对象,相对抽象优雅,但容易过度抽象。7,在实际使用的python入门简单,但要学会用python干活,需要再学习python各种库,pyhton的强大在于库,为什么python的库强大,原因是python的库可以用python,c语言,c++等设计,再提供给python使用,所以无论gpu运行,神经网络,智能算法,数据分析,图像处理,科学计算,各式各样的库在等着你用。而java没有python那么多的开源库,很多库是商业公司内部使用,或发布出来只是一个jar包,看不到原始代码。python虚拟机因为编译性没有java的支持的好(或者说故意这么设计的),一般直接使用源码(linux),或源码简单打个包(如pyexe)。实例:在java类中直接执行python语句如:maven添加依赖<dependency>    <groupId>org.python</groupId>    <artifactId>jython-standalone</artifactId>    <version>2.7.0</version></dependency>在java类中写python语句PythonInterpreter interpreter = new PythonInterpreter();interpreter.exec("menu=[1,2,3,5,6,7]; ");interpreter.exec("print(sorted(menu));"); interpreter.exec("print sorted(menu);");
  • [技术干货] Java,自从看了你一眼,就再也无法忘怀[转载]
    文章目录一、初识Java二、我与Java差点擦肩而过三、我的第一个Java项目四、我用过的开发工具五、Java经久不衰的关键总结转眼间Java已经27岁了,Java在1995年5月23日诞生,诞生之后在到现在以经27年了,但依旧保持旺盛的活力,那是因为Java语言作为静态面向对象编程语言的代表,极好的实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程,Java具有简单性,面向对象,分布式,健壮性,安全性,平台独立与可移植性,多线程,动态性等特点,总的来说,Java是一门非常方便的语言,只要你能想到的方法,都有大佬已经帮你写好了,非常的方便,我相信Java在后续的发展中,一定会越来越好,我自己本身也是一个大学生,学习的也是Java语言,未来也会在Java这个领域一直干下去一、初识Java我首次接触Java的时候还是在我大学的时候第一节JavaSE课程,我们的Java老师给我们介绍Java的产生和发展,我对Java产生了憧憬,在课后敲下了我的第一行Java代码:public class Main {    public static void main(String[] args) {    System.out.println("hello world!!!");    }}我相信大部分的Java生涯都是从这行代码开始的,这是我Java生涯的起点,也是我和Java的故事的起点二、我与Java差点擦肩而过我现在是一名大三的学生,不准备考研的我当然是准备学习一门专业知识,出社会后找到一个满意的工作,对于我的专业来说,计算机科学与技术的学生,从事编程工作无非就是C/C++,Java,还有python,我就在考虑我到时候到底从事哪个领域,我在Java和C++ 中犹豫了很久,最终选择了Java,既然选择了它,我就要认真的对待它,毕竟我可是一个很专一的人,但是在我Java相处的时间里,开始的相处,我对它还不是很熟悉,我完全看不明白它,在一段时间里,我甚至觉得我和它不合适,我和它的在一起就是一个错误,但是再后来我发现之前是因为我不够了解它,在我和Java后面的陆续相处中,我发现Java非常的有意思,你越了解它越觉得它有意思三、我的第一个Java项目我的第一个Java项目,是一个很简单的命令行实现的图书管理系统,就这么一个很简单的小项目对于当时的我来说就觉得非常的困难,但是当你真的完成了它的时候,那种成就感是任何事情都带不来的,这个项目几乎包含了JavaSE基础语法部分,这也是对基础知识的一个检验四、我用过的开发工具在我上大学时的Java课上,我们的Java老师给我们推荐的是一款叫eclipse的软件,这也是我第一次使用开发工具,在当时连安装JDK,搭建环境对我来说都还是一个难题,我也是在这个开发工具上敲的我的第一行Java代码,后来在朋友的推荐下,我使用了IDEA这款开发工具,这款工具相对于eclipse来说要好用很多,非常的方便,而JDK,我一直使用的是JDK8五、Java经久不衰的关键1.无处不在、免费Java是免费下载和简单易用的,因此它对有远见卓识的开发人员和企业很有吸引力,而且可能只花很少的预算。因为Java无处不在,所以很容易向你的CTO或客户销售可靠、无风险的产品。开发人员和项目团队可以找到并指出许多基于Java的站点示例,以减轻高级管理人员或客户的担忧。想学习java的同学不妨报个Java培训班,可以节省学习时间,提高学习效率,在短时间内学有所成,还能找到一份不错的工作。2.平等机会申请Java编程语言支持分布式环境、internet使用和将在具有多个服务器和客户端的网络上运行的应用程序。它可以用于网站、移动应用程序、智能设备等,在小程序或应用程序模块中也同样有效。它适用于网络浏览器、在线商店、投票和论坛、表单处理、手机应用程序和消费产品。总结我的Java学习之路还很漫长,后面要学习的东西还很多,在后续我也会一直从事Java领域,希望Java会一直越来越好。原文链接:https://blog.csdn.net/weixin_57011679/article/details/124946316
  • [毕昇JDK] 【技术剖析】14. Java反射机制清空字符串导致业务异常分析
    > 编者按:笔者在处理业务线问题时遇到接口返回的内容和实际内容不一致的现象。根因是业务方通过Java反射机制将String类型敏感数据引用的value数组元素全部设置为'0',从而实现清空用户敏感数据的功能。这种清空用户敏感数据的方法会将字符串常量池相应地址的内容修改,进而导致所有指向该地址的引用的内容和实际值不一致的现象。 ## 背景知识 JVM为了提高性能和减少内存开销,在实例化字符串常量时进行了优化。JVM在Java堆上开辟了一个字符串常量池空间(StringTable),JVM通过ldc指令加载字符串常量时会调用 StringTable::intern 函数将字符串加入到字符串常量池中。 - StringTable::intern函数代码 ```c oop StringTable::intern(Handle string_or_null, jchar* name, int len, TRAPS) { unsigned int hashValue = hash_string(name, len); int index = the_table()->hash_to_index(hashValue); oop found_string = the_table()->lookup(index, name, len, hashValue); // Found if (found_string != NULL) { ensure_string_alive(found_string); return found_string; } debug_only(StableMemoryChecker smc(name, len * sizeof(name[0]))); assert(!Universe::heap()->is_in_reserved(name), "proposed name of symbol must be stable"); Handle string; // try to reuse the string if possible if (!string_or_null.is_null()) { string = string_or_null; } else { string = java_lang_String::create_from_unicode(name, len, CHECK_NULL); } #if INCLUDE_ALL_GCS if (G1StringDedup::is_enabled()) { // Deduplicate the string before it is interned. Note that we should never // deduplicate a string after it has been interned. Doing so will counteract // compiler optimizations done on e.g. interned string literals. G1StringDedup::deduplicate(string()); } #endif // Grab the StringTable_lock before getting the_table() because it could // change at safepoint. oop added_or_found; { MutexLocker ml(StringTable_lock, THREAD); // Otherwise, add to symbol to table added_or_found = the_table()->basic_add(index, string, name, len, hashValue, CHECK_NULL); } ensure_string_alive(added_or_found); return added_or_found; } ``` - StringTable::intern 函数处理流程 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693680014556176.png) - 字符串的创建方式 根据StringTable::intern函数处理流程,我们可以简单描绘如下6种常见的字符串的创建方式以及引用关系。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693721592211530.png) ## 现象 某业务线使用fastjson实现Java对象序列化功能,低概率出现接口返回的JSON数据的某个属性值和实际值不一致的现象。正确的属性值应该为"null",实际属性值却为"0000"。 ## 原因分析 为了排除fastjson自身的嫌疑,我们将其替换jackson后,依然会低概率出现同样的现象。由于两个不同三方件同时存在这个问题的可能性不大,为此我们暂时排除fastjson引入该问题的可能性。为了找到该问题的根因,我们在环境中开启远程调试功能。待问题复现,调试代码时我们发现只要是指向"null"的引用,显示的内容全部变成"0000",由此我们初步怀疑字符串常量池中的"null"被修改成"0000"。 一般导致常量池被修改有两种可能性: 1. 第三方动态库引入的bug导致字符串常量池内容被修改; 2. 在业务代码中通过Java反射机制主动修改字符串常量池内容; 业务方排查项目中使用到的第三方动态库,未发现可疑的动态库,排除第一种可能性。排查业务代码中使用到Java反射的功能,发现清空密码功能会使用到Java反射机制,并且将String类型密码的value数组元素全部设置为'0'。 业务出现的现象可以简单通过代码模拟: 1. 在TestString对象类中定义一个nullStr属性,初始值为"null"; 2. 定义一个带有password属性的User类; 3. 在main方法中创建一个密码为"null"的User对象,使用Java反射机制将密码字符串的所有字符全部修改为'0',分别在密码修改前后打印TestString对象nullStr属性值; ## 复现代码 ```java import java.lang.reflect.Field; import java.util.Arrays; public class TestString { private String nullStr = "null"; public String getNullStr() { return nullStr; } static class User { private final String password; User(String password) { this.password = password; } public String getPassword() { return password; } } private static void clearPassword(User user) throws Exception { Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] chars = (char[]) field.get(user.getPassword()); Arrays.fill(chars, '0'); } public static void main(String[] args) throws Exception { User user = new User("null"); TestString testString = new TestString(); System.out.println("before clear password >>>>"); System.out.println(" User.password:" + user.getPassword()); System.out.println("TestString.nullStr:" + testString.getNullStr()); System.out.println("--------------------------------"); clearPassword(user); System.out.println("after clear password >>>>"); System.out.println(" User.password:" + user.getPassword()); System.out.println("TestString.nullStr:" + testString.getNullStr()); } } ``` 复现代码字符串引用关系如下图所示。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693744310705244.png) User对象的password属性和TestString的nullStr属性引用都同时指向常量池中的"null"字符串,"null"字符串的value指向 {'n','u','l','l'} char数组。使用Java反射机制将User对象的password属性引用的value数组全部设置为'0',导致 TestString的nullStr属性值也变成了 "0000"。 输出结果如下: ``` before clear password >>>> User.password:null TestString.nullStr:null -------------------------------- after clear password >>>> User.password:0000 TestString.nullStr:0000 ``` 通过输出结果我们可以发现在通过Java反射机制修改某一个字符串内容后,所有指向原字符串的引用的内容全部变成修改后的内容。 ## 总结 在保存业务敏感数据时避免使用String类型保存,建议使用byte[]或char[]数组保存,然后通过Java反射机制清空敏感数据。 ## 后记 如果遇到相关技术问题(包括不限于毕昇 JDK),可以通过 Compiler SIG 求助。Compiler SIG 每双周周二举行技术例会,同时有一个技术交流群讨论 GCC、LLVM 和 JDK 等相关编译技术,感兴趣的同学可以添加如下微信小助手入群。 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693821688262524.jpg) ----- 原文转载自毕昇编译-[Java反射机制清空字符串导致业务异常分析](https://mp.weixin.qq.com/s/jLkof6Z1MMzBJ7eODV0pWQ) 关注毕昇编译获取编译技术更多信息 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/20/1655693932992153146.jpg)
  • [技术干货] 这是啥SQL,室友看了人傻了[转载]
    文章目录SQLite适应常规基本应用场景SQLite面对复杂场景尚有不足SPL全面支持各种数据源SPL的计算能力更强大优化体系结构SPL资料可以在Java应用中嵌入的数据引擎看起来比较丰富,但其实并不容易选择。Redis计算能力很差,只适合简单查询的场景。Spark架构复杂沉重,部署维护很是麻烦。H2\HSQLDB\Derby等内嵌数据库倒是架构简单,但计算能力又不足,连基本的窗口函数都不支持。相比之下,SQLite在架构性和计算能力上取得了较好的平衡,是应用较广的Java嵌入数据引擎。SQLite适应常规基本应用场景SQLite架构简单,其核心虽然是C语言开发的,但封装得比较好,对外呈现为一个小巧的Jar包,能方便地集成在Java应用中。SQLite提供了JDBC接口,可以被Java调用:Connection connection = DriverManager.getConnection("jdbc:sqlite::memory:");Statement st = connection.createStatement();st.execute("restore from d:/ex1");ResultSet rs = st.executeQuery("SELECT * FROM orders");1234SQLite提供了标准的SQL语法,常规的数据处理和计算都没有问题。特别地,SQLite已经能支持窗口函数,可以方便地实现很多组内运算,计算能力比其他内嵌数据库更强。SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x;SELECT a, b, group_concat(b, '.') OVER ( ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS group_concat FROM t1;12SQLite面对复杂场景尚有不足SQLite的优点亮眼,但对于复杂应用场景时还是有些缺点。Java应用可能处理的数据源多种多样,比如csv文件、RDB、Excel、Restful,但SQLite只处理了简单情况,即对csv等文本文件提供了直接可用的命令行加载程序:.import --csv --skip 1 --schema temp /Users/scudata/somedata.csv tab1对于其他大部分数据源,SQLite都没有提供方便的接口,只能硬写代码加载数据,需要多次调用命令行,整个过程很繁琐,时效性也差。以加载RDB数据源为例,一般的做法是先用Java执行命令行,把RDB库表转为csv;再用JDBC访问SQLite,创建表结构;之后用Java执行命令行,将csv文件导入SQLite;最后为新表建索引,以提高性能。这个方法比较死板,如果想灵活定义表结构和表名,或通过计算确定加载的数据,代码就更难写了。类似地,对于其他数据源,SQLite也不能直接加载,同样要通过繁琐地转换过程才可以。SQL接近自然语言,学习门槛低,容易实现简单的计算,但不擅长复杂的计算,比如复杂的集合计算、有序计算、关联计算、多步骤计算。SQLite采用SQL语句做计算,SQL优点和缺点都会继承下来,勉强实现这些复杂计算的话,代码会显得繁琐难懂。比如,某只股票最长的上涨天数,SQL要这样写:select max(continuousDays)-1from (select count(*) continuousDaysfrom (select sum(changeSign) over(order by tradeDate) unRiseDaysfrom (select tradeDate,case when price>lag(price) over(order by tradeDate) then 0 else 1 end changeSign from AAPL) )group by unRiseDays)123456这也不单是SQLite的难题,事实上,由于集合化不彻底、缺乏序号、缺乏对象引用等原因,其他SQL数据库也不擅长这些运算。业务逻辑由结构化数据计算和流程控制组成,SQLite支持SQL,具有结构化数据计算能力,但SQLite没有提供存储过程,不具备独立的流程控制能力,也就不能实现一般的业务逻辑,通常要利用Java主程序的判断和循环语句。由于Java没有专业的结构化数据对象来承载SQLite数据表和记录,转换过程麻烦,处理过程不畅,开发效率不高。前面提过,SQLite内核是C程序,虽然可以被集成到Java应用中,但并不能和Java无缝集成,和Java主程序交换数据时要经过耗时的转换才能完成,在涉及数据量较大或交互频繁时性能就会明显不足。同样因为内核是C程序,SQLite会在一定程度上破坏Java架构的一致性和健壮性。对于Java应用来讲,原生在JVM上的esProc SPL是更好的选择。SPL全面支持各种数据源esProc SPL是JVM下开源的嵌入数据引擎,架构简单,可直接加载数据源,可以通过JDBC接口被Java集成调用,并方便地进行后续计算。SPL架构简单,无须独立服务,只要引入SPL的Jar包,就可以部署在Java环境中。直接加载数据源,代码简短,过程简单,时效性强。比如加载Oracle:A1    =connect("orcl")2    =A1.query@x("select OrderID,Client,SellerID,OrderDate,Amount from orders order by OrderID")3    >env(orders,A2)对于SQLite擅长加载的csv文件,SPL也可以直接加载,使用内置函数而不是外部命令行,稳定且效率高,代码更简短:=T(“/Users/scudata/somedata.csv”)多种外部数据源。除了RDB和csv,SPL还直接支持txt\xls等文件,MongoDB、Hadoop、redis、ElasticSearch、Kafka、Cassandra等NoSQL,以及WebService XML、Restful Json等多层数据。比如,将HDSF里的文件加载到内存:A1    =hdfs_open(;"hdfs://192.168.0.8:9000")2    =hdfs_file(A1,"/user/Orders.csv":"GBK")3    =A2.cursor@t()4    =hdfs_close(A1)5    >env(orders,A4)    JDBC接口可以方便地集成。加载的数据量一般比较大,通常在应用的初始阶段运行一次,只须将上面的加载过程存为SPL脚本文件,在Java中以存储过程的形式引用脚本文件名:Class.forName("com.esproc.jdbc.InternalDriver");Connection conn =DriverManager.getConnection("jdbc:esproc:local://");CallableStatement statement = conn.prepareCall("{call init()}");statement.execute();1234SPL的计算能力更强大SPL提供了丰富的计算函数,可以轻松实现日常计算。SPL支持多种高级语法,大量的日期函数和字符串函数,很多用SQL难以表达的计算,用SPL都可以轻松实现,包括复杂的有序计算、集合计算、分步计算、关联计算,以及带流程控制的业务逻辑。丰富的计算函数。SPL可以轻松实现各类日常计算:A    B1    =Orders.find(arg_OrderIDList)    //多键值查找2    =Orders.select(Amount>1000 && like(Client,\"*S*\"))    //模糊查询3    = Orders.sort(Client,-Amount)    //排序4    = Orders.id(Client)    //去重5    =join(Orders:O,SellerId; Employees:E,EId).new(O.OrderID, O.Client,O.Amount,E.Name,E.Gender,E.Dept)    //关联标准SQL语法。SPL也提供了SQL-92标准的语法,比如分组汇总:$select year(OrderDate) y,month(OrderDate) m, sum(Amount) s,count(1) cfrom {Orders}Where Amount&gt;=? and Amount&lt;? ;arg1,arg2123函数选项、层次参数等方便的语法。功能相似的函数可以共用一个函数名,只用函数选项区分差别,比SQL更加灵活方便。比如select函数的基本功能是过滤,如果只过滤出符合条件的第1条记录,可使用选项@1:T.select@1(Amount>1000)二分法排序,即对有序数据用二分法进行快速过滤,使用@b:T.select@b(Amount>1000)有序分组,即对分组字段有序的数据,将相邻且字段值相同的记录分为一组,使用@b:T.groups@b(Client;sum(Amount))函数选项还可以组合搭配,比如:Orders.select@1b(Amount>1000)结构化运算函数的参数有些很复杂,比如SQL就需要用各种关键字把一条语句的参数分隔成多个组,但这会动用很多关键字,也使语句结构不统一。SPL使用层次参数简化了复杂参数的表达,即通过分号、逗号、冒号自高而低将参数分为三层:join(Orders:o,SellerId ; Employees:e,EId)更丰富的日期和字符串函数。除了常见函数,比如日期增减、截取字符串,SPL还提供了更丰富的日期和字符串函数,在数量和功能上远远超过了SQL,同样运算时代码更短。比如:季度增减:elapse@q(“2020-02-27”,-3) //返回2019-05-27N个工作日之后的日期:workday(date(“2022-01-01”),25) //返回2022-02-04字符串类函数,判断是否全为数字:isdigit(“12345”) //返回true取子串前面的字符串:substr@l(“abCDcdef”,“cd”) //返回abCD按竖线拆成字符串数组:“aa|bb|cc”.split(“|”) //返回[“aa”,“bb”,“cc”]SPL还支持年份增减、求季度、按正则表达式拆分字符串、拆出SQL的where或select部分、拆出单词、按标记拆HTML等大量函数。简化有序运算。涉及跨行的有序运算,通常都有一定的难度,比如比上期和同期比。SPL使用"字段[相对位置]"引用跨行的数据,可显著简化代码,还可以自动处理数组越界等特殊情况,比SQL窗口函数更加方便。比如,追加一个计算列rate,计算每条订单的金额增长率:=T.derive(AMOUNT/AMOUNT[-1]-1: rate)综合运用位置表达式和有序函数,很多SQL难以实现的有序运算,都可以用SPL轻松解决。比如,根据考勤表,找出连续 4 周每天均出勤达 7 小时的学生:A1    =Student.select(DURATION>=7).derive(pdate@w(ATTDATE):w)2    =A1.group@o(SID;~.groups@o(W;count(~):CNT).select(CNT==7).group@i(W-W[-1]!=7).max(~.len()):weeks)3    =A2.select(weeks>=4).(SID)简化集合运算,SPL的集合化更加彻底,配合灵活的语法和强大的集合函数,可大幅简化复杂的集合计算。比如,在各部门找出比本部门平均年龄小的员工:A1    =Employees.group(DEPT; (a=~.avg(age(BIRTHDAY)),~.select(age(BIRTHDAY)<a)):YOUNG)2    =A1.conj(YOUNG)计算某支股票最长的连续上涨天数:A1    =a=0,AAPL.max(a=if(price>price[-1],a+1,0))简化关联计算。SPL支持对象引用的形式表达关联,可以通过点号直观地访问关联表,避免使用JOIN导致的混乱繁琐,尤其适合复杂的多层关联和自关联。比如,根据员工表计算女经理的男员工:=employees.select(gender:“male”,dept.manager.gender:“female”)方便的分步计算,SPL集合化更加彻底,可以用变量方便地表达集合,适合多步骤计算,SQL要用嵌套表达的运算,用SPL可以更轻松实现。比如,找出销售额累计占到一半的前n个大客户,并按销售额从大到小排序:A    B2    =sales.sort(amount:-1)    /销售额逆序排序,可在SQL中完成3    =A2.cumulate(amount)    /计算累计序列4    =A3.m(-1)/2    /最后的累计即总额5    =A3.pselect(~>=A4)    /超过一半的位置6    =A2(to(A5))    /按位置取值流程控制语法。SPL提供了流程控制语句,配合内置的结构化数据对象,可以方便地实现各类业务逻辑。分支判断语句:A    B2    …    3    if T.AMOUNT>10000    =T.BONUS=T.AMOUNT*0.054    else if T.AMOUNT>=5000 && T.AMOUNT<10000    =T.BONUS=T.AMOUNT*0.035    else if T.AMOUNT>=2000 && T.AMOUNT<5000    =T.BONUS=T.AMOUNT*0.02循环语句:A    B1    =db=connect("db")    2    =T=db.query@x("select * from sales where SellerID=? order by OrderDate",9)3    for T    =A3.BONUS=A3.BONUS+A3.AMOUNT*0.014        =A3.CLIENT=CONCAT(LEFT(A3.CLIENT,4), " co.,ltd.")5         …与Java的循环类似,SPL还可用break关键字跳出(中断)当前循环体,或用next关键字跳过(忽略)本轮循环,不展开说了。计算性能更好。在内存计算方面,除了常规的主键和索引外,SPL还提供了很多高性能的数据结构和算法支持,比大多数使用SQL的内存数据库性能好得多,且占用内存更少,比如预关联技术、并行计算、指针式复用。优化体系结构SPL支持JDBC接口,代码可外置于Java,耦合性更低,也可内置于Java,调用更简单。SPL支持解释执行和热切换,代码方便移植和管理运营,支持内外存混合计算。外置代码耦合性低。SPL代码可外置于Java,通过文件名被调用,既不依赖数据库,也不依赖Java,业务逻辑和前端代码天然解耦。对于较短的计算,也可以像SQLite那样合并成一句,写在Java代码中:Class.forName("com.esproc.jdbc.InternalDriver");Connection conn =DriverManager.getConnection("jdbc:esproc:local://");Statement statement = conn.createStatement();String arg1="1000";String arg2="2000"ResultSet result = statement.executeQuery(=Orders.select(Amount>="+arg1+" && Amount<"+arg2+"). groups(year(OrderDate):y,month(OrderDate):m; sum(Amount):s,count(1):c)");123456解释执行和热切换。业务逻辑数量多,复杂度高,变化是常态。良好的系统构架,应该有能力应对变化的业务逻辑。SPL是基于Java的解释型语言,无须编译就能执行,脚本修改后立即生效,支持不停机的热切换,适合应对变化的业务逻辑。方便代码移植。SPL通过数据源名从数据库取数,如果需要移植,只要改动配置文件中的数据源配置信息,而不必修改SPL代码。SPL支持动态数据源,可通过参数或宏切换不同的数据库,从而进行更方便的移植。为了进一步增强可移植性,SPL还提供了与具体数据库无关的标准SQL语法,使用sqltranslate函数可将标准SQL转为主流方言SQL,仍然通过query函数执行。方便管理运营。由于支持库外计算,代码可被第三方工具管理,方便团队协作;SPL脚本可以按文件目录进行存放,方便灵活,管理成本低;SPL对数据库的权限要求类似Java,不影响数据安全。内外存混合计算。有些数据太大,无法放入内存,但又要与内存表共同计算,这种情况可利用SPL实现内外存混合计算。比如,主表orders已加载到内存,大明细表orderdetail是文本文件,下面进行主表和明细表的关联计算:A1    =file("orderdetail.txt").cursor@t()2    =orders.cursor()3    =join(A1:detail,orderid ; A2:main,orderid)4    =A3.groups(year(main.orderdate):y; sum(detail.amount):s)SQLite使用简单方便,但数据源加载繁琐,计算能力不足。SPL架构也非常简单,并直接支持更多数据源。SPL计算能力强大,提供了丰富的计算函数,可以轻松实现SQL不擅长的复杂计算。SPL还提供多种优化体系结构的手段,代码既可外置也可内置于Java,支持解释执行和热切换,方便移植和管理运营,并支持内外存混合计算。原文链接:https://blog.csdn.net/m0_60264772/article/details/125273709
  • [使用说明] 开始使用CodeArts
    本篇内容主要介绍使用CodeArts创建工程、代码补全和重构、运行调试代码、Build构建和测试相关的主要功能。一、下载安装CodeArtsCodeArts安装要求         至少需要 2 GB RAM ,但是推荐8 GB RAM;         至少需要 2.5 GB 硬盘空间,推荐SSD;         64位Microsoft Windows 10下载并安装CodeArts        >>>前往CodeArts官方下载页面        下载解压完成后,运行CodeArts-*.exe文件。        按照安装导航的步骤,选择个人安装配置进行安装。二、CodeArts登陆与激活        运行CodeArts,前往CodeArts登陆与激活三、创建或导入Java工程CodeArts支持选择四种Java模板创建工程,选择创建SpringBoot工程时,可根据需求选择(可多选)相应的第三方依赖,创建成功后第三方依赖被成功写入pom.xml或build.gradle文件。创建成功的提示弹窗中,点击→此窗口,工程在当前窗口打开。点击→新窗口,CodeArts将打开新窗口并加载已创建的工程。CodeArts工程创建完成,系统自动进入工程工作界面。创建工程实例:CodeArts同样可以导入已有的Java工程,见下方:四、语言服务初始化与日志查看加载项目时,Java语言服务会进行初始化,状态栏会有语言服务初始化过程提示信息,点击可查看更多语言服务初始化过程的日志。语言服务初始化过程中会启动相关服务、下载依赖的Jar包及进行Indexing,此过程受计算机性能、网速等因素影响会耗费一定的时间。语言服务初始化完成之前,语言服务相关功能(如代码补全、代码重构、查看类型定义等)将不会有很好的体验,此时需耐心等待语言服务初始化完成。下图:点击语言服务状态栏查看更多信息下图:语言服务未初始化完成时,代码补全提示‘Element information is not available during index update’当右下角弹出提示“Language Server is ready”时(见下图),说明语言服务已初始化完毕,此时可执行文件类和方法会出现运行按钮,我们就可以开始正常使用语言服务的全部功能。五、代码补全和重构语言服务初始化完成后,即可使用代码补全和代码重构等功能。代码补全列表中包含语言服务的补全及强大的AI智能补全(带有⊕图标),见下图。>>>更多代码补全使用详情通过顶部菜单“重构”功能或者右键菜单中“Refactor”即可使用代码重构的功能,CodeArts同样支持使用快捷键来快速进行代码重构。>>>更多重构使用详情CodeArts还提供了华为云SDK代码补全助手,自动生成华为云SDK使用的模板代码(右键菜单中可解锁启用)。语言服务的其它功能(如查找引用,转到声明等),请自行尝试使用。六、代码运行调试语言服务初始化完成后,在可运行的文件左侧会显示运行图标,选择run或者debug即可开始调试,调试控制台中将会显示调试运行的信息。CodeArts同样支持配置更多运行参数,可在代码左侧设置断点,debug进入断点后,可在右侧运行视图中查看调试相关信息(变量、监视、调用堆栈),也可以对断点进行管理。 CodeArts不支持并行运行,如果在当前文件或跨文件同时触发多个类和方法的运行,CodeArts将提示相应消息。七、构建工程CodeArts会在代码调试运行前自动进行工程构建,我们同样可以通过菜单项或者构建视图单独构建工程,构建视图右侧将显示构建过程信息。八、运行单元测试用例CodeArts在底部测试视图提供单元测试运行功能。运行当前文件所有用例,请点击类文件左侧绿色按钮,选择Run模式,底部栏自动打开测试视图,展示当前运行所有用例,右侧输出运行日志。运行当前单个测试用例,请点击用例左侧绿色按钮,选择Run模式或点击测试视图列表内用例右侧的绿色按钮,测试视图将展示当前运行的用例,点击用例后右侧输出该用例的运行日志。底部栏测试视图提供了用例管理的相关功能,如筛选、字母排序、耗时排序、运行日志、终止运行。
  • [问题求助] 设备接入IOTDA使用Java Demo获取不到token
    【功能模块】【操作步骤&问题现象】1、已经配置好了Java和IDEA2、这两步骤也做了,出现了以下报错:推测:没有获取到token,token中为空,怎么解?
  • [使用说明] CodeArts快捷键(一)
    CodeArts快捷键在编码过程中经常使用,能够极大提升编码效率。键盘快捷键编辑器CodeArts使用键盘快捷键编辑器提供丰富且简单的键盘快捷键编辑体验。您可以通过快捷键Ctrl+K Ctrl+S或点击左下角的Manage > Keyboard Shortcuts来打开快捷键编辑器。它列出了所有绑定及未绑定的可用命令,您可以通过使用右键菜单轻松更改/删除/重置其键绑定。顶部搜索框可帮助您查找命令或键绑定。 键盘快捷键编辑器主要包含Command、Keybinding、When、Source,其中您可以通过When值来查看何种条件下使用快捷键,如果您的快捷键没有when值,则键绑定为全局可用。检测键绑定冲突如果您自定义了键盘快捷键,有时可能会遇到键绑定冲突,即相同的键盘快捷键映射到多个命令。这可能会让您感到混乱,特别是当您在编辑器中操作快捷键,相同的快捷键绑定不同的When值时。 键盘快捷键编辑器有一个上下文菜单命令Show Same Keybindings,该命令将根据键盘快捷键过滤键绑定以显示冲突。选择一个您认为重复的快捷键,您可以查看是否定义了多个命令、键绑定的来源及触发条件。录制按键功能录制按键功能可以帮助您快速找到键绑定及命令,按快捷键Alt+K或点击Record Keys,在键盘敲快捷键,即可成功查找到该快捷键绑定的所有命令。默认已绑定快捷键基本的编辑功能命令快捷键功能剪切Ctrl+X/Shift+Delete剪切当前行或选定的内容到剪切板复制Ctrl+C/Ctrl+Insert复制当前行或选定的内容到剪切板粘贴Ctrl+V/Shift+Insert从剪切板粘贴删除行Ctrl+Shift+K删除当前行在下面插入行Ctrl+Shift+Enter/Shift+Enter在光标下方开始新的一行在上面插入行Ctrl+Alt+ Enter在光标上方开始新的一行向下移动行Ctrl+Shift+DownArrow/Shift+Alt+DownArrow将当前行向下移动向上移动行Ctrl+Shift+UpArrow/Shift+Alt+UpArrow将当前行向上移动向下复制行Ctrl+D将当前行向下复制撤消Ctrl+Z返回上一次操作恢复Ctrl+Y恢复上一次操作选择全部Ctrl+A全选内容光标撤消Shift+AIt+J撤消最后一次光标操作在行尾添加光标Shift+AIt+I在选定的每一行的末尾插入光标选择所有找到的查找匹配项Ctrl+Shift+Alt+J选择当前选择的所有匹配项更改所有匹配项Shift+F6选择当前单词的所有匹配项在下面添加光标Ctrl+Alt+DownArrow在下方插入光标在上面添加光标Ctrl+Alt+UpArrow在上方插入光标转到括号Ctrl+Shift+\跳转到匹配的括号行缩进Ctrl+]缩进代码行减少缩进Ctri+[反缩进代码转到行首Home转到当前行的顶部转到行尾End转到当前行的尾部转到文件末尾Ctrl+End转到文件末尾转到文件开头Ctrl+Home转到文件开头向下滚动行Ctrl+DownArrow向下滚动行向上滚动行Ctrl+UpArrow向上滚动行向下滚动页面Alt+PageDown向下滚动页面向上滚动页面Alt+PageUp向上滚动页面折叠Ctrl+-折叠所有代码块展开Ctrl++/Ctrl+=展开所有代码块添加行注释Ctrl+K Ctrl+C添加行注释删除行注释Ctrl+K Ctrl+U删除行注释切换行注释Ctrl+/注释/取消行注释切换块注释Ctrl+Shift+/注释/取消块注释查找Ctrl+F文件内查找替换Ctrl+R文件内替换查找下一个F3/Enter查找模式下,向下查找查找上一个Shift+F3查找模式下,向上查找切换Tab键移动焦点Ctrl+M使用 Tab 键设置焦点查看: 切换自动换行Alt+Z显示/隐藏自动换行丰富的语言编辑命令快捷键功能触发建议Ctrl+Shift+Space触发代码推荐格式化文档Shift+Alt+F格式化文件格式化选定内容Ctrl+K Ctrl+F格式选择的文件内容转到定义Ctrl+B/Ctrl+Enter跳转到光标所在的方法、类的定义处显示悬停Ctrl+Q显示鼠标所在位置的代码的简要信息速览定义Alt+F11快速打开光标所在方法、类的定义打开侧边的定义Ctrl+K F12分屏展示代码的定义快速修复Alt+Enter代码报错,提供修复方案转到引用Shift+F12跳转到引用重命名符号Shift+F6重命名符号展开选择Shift+Alt+RightArrow展开选择收起选择Shift+Alt+LeftArrow收起选择裁剪尾随空格Ctrl+K Ctrl+X去掉行末尾没用的空格Show Call HierarchyShift+Alt+H调用层次结构代码重构命令快捷键功能Introduce VariableCtrl+Alt+V引入变量Introduce FieldCtrl+Alt+Shift+F引入字段Introduce ConstantCtrl+Alt+C引入常量Introduce ParameterCtrl+Alt+Shift+P引入参数Extract MethodCtrl+Alt+Shift+M提取方法Copy classShift+F5复制类Change Class SignatureCtrl+F6更改类签名Change Method SignatureCtrl+F6更改方法签名Inline ParameterCtrl+Alt+Shift+P内联参数Inline MethodCtrl+Alt+Shift+L内联方法导航命令快捷键功能后退Ctrl+Alt+LeftArrow退回到上一个操作的地方前进Ctrl+Alt+RightArrow前进到上一个操作的地方转到上一编辑位置Ctrl+Shift+Backspace光标跳转到上一次编辑位置转到编辑器中的符号Ctrl+F12/Ctrl+Shift+Alt+N转到编辑器中的符号转到文件…Ctrl+Shift+N打开文件搜索面板转到行/列Ctrl+G当前文件跳转到行视图: 快速打开组中上一个最近使用过的编辑器Ctrl+Tab快速打开组中上一个最近使用过的编辑器编辑器/窗口管理命令快捷键功能关闭窗口Ctrl+W/Ctrl+Shift+W关闭CodeArts窗口视图: 拆分编辑器Ctrl+\拆分编辑器视图: 关闭编辑器Ctrl+F4关闭编辑器视图: 关闭组中的所有编辑器Ctrl+K W关闭组中的所有编辑器视图: 关闭所有编辑器Ctrl+K Ctrl+W关闭所有编辑器视图: 重新打开已关闭的编辑器Ctrl+Shift+T重新打开已关闭的编辑器视图: 聚焦于第一个编辑器组Ctrl+1聚焦于第一个编辑器组视图: 聚焦于第二个编辑器组Ctrl+2聚焦于第二个编辑器组视图: 聚焦于第三个编辑器组Ctrl+3聚焦于第三个编辑器组视图: 聚焦到上一组编辑器Shift+Alt+Tab聚焦到上一组编辑器视图: 聚焦到下一组编辑器Alt+Tab聚焦到下一组编辑器视图: 向左移动编辑器Ctrl+Shift+PageUp向左移动编辑器视图: 向右移动编辑器Ctrl+Shift+PageDown向右移动编辑器视图: 向左移动编辑器组Ctrl+K LeftArrow向左移动编辑器组视图: 向右移动编辑器组Ctrl+K RightArrow向右移动编辑器组文件/工程管理命令快捷键功能工程: 打开工程Ctrl+O打开工程工程: 打开工程属性Shift+Alt+F9打开工程属性工程: 打开文件夹...Ctrl+Shift+O打开文件夹…工程: 导入工程Ctrl+Shift+I弹出导入工程窗口工程: 关闭文件夹/工程Ctrl+K F关闭文件夹/工程工程: 新建工程Alt+P弹出新建工程窗口文件: 新建文件Ctrl+Alt+N弹出新建文件窗口文件: 保存Ctrl+S保存所有文件: 另存为...Ctrl+Shift+S另存为文件: 打开最近的文件…Ctrl+E打开最近的文件文件: 复制活动文件的路径Ctrl+Shift+C复制绝对路径文件: 复制活动文件的相对路径Ctrl+K Ctrl+Shift+C复制相对路径显示命令快捷键功能视图: 切换全屏Ctrl+Alt+F切换全屏切换禅模式Ctrl+K Z切换禅模式退出禅模式Escape Escape退出禅模式显示快速修复Ctrl+.显示问题的修复方案显示所有命令Ctrl+Shift+A打开命令面板视图: 显示资源管理器Alt+1显示/隐藏资源管理器视图视图: 显示搜索Alt+3打开文本搜索视图: 显示源代码管理Alt+9显示/隐藏源代码管理视图视图: 显示运行和调试Alt+5/Ctrl+Shift+F8显示/隐藏运行视图视图: 切换输出Ctrl+Shift+U显示/隐藏输出视图视图: 切换集成终端Alt+F12显示/隐藏终端视图Markdown: 打开预览Ctrl+Shift+V打开Markdown预览Markdown: 打开侧边预览Ctrl+K V在侧边打开Markdown预览搜索命令快捷键功能智能搜索Ctrl Ctrl/Ctrl+N/Ctrl+Shift+L打开智能搜索面板视图: 显示搜索Alt+3打开文本搜索面板搜索: 在文件中查找Ctrl+Shift+F在文件中查找搜索: 在文件中替换Ctrl+Shift+R在文件中替换显示下一个搜索词DownArrow/Alt+DownArrow显示下一个搜索词显示上一个搜索词UpArrow/Alt+UpArrow显示上一个搜索词设置命令快捷键功能首选项: 打开设置Ctrl+,打开设置首选项: 打开Java SmartAssist开发套件设置Ctrl+Alt+P打开Java SmartAssist开发套件设置首选项: 打开键盘快捷方式Ctrl+K Ctrl+S打开键盘快捷方式首选项: 颜色主题Ctrl+`切换颜色主题运行/调试/构建命令快捷键功能运行: 开始执行(不调试)Shift+F10运行,不进入断点开始调试项目Ctrl+Alt+D调试Project调试: 开始调试Shift+F9调试停止调试Ctrl+F2停止调试Debug: 单步调试F7单步执行,进入函数内部Debug: 单步跳出Shift+F8单步执行,跳出函数内部Debug: 单步跳过F8从断点处开始,执行单步语句Debug: 继续F9执行至下一个断点Debug: 停止Ctrl+F2停止调试构建工程Ctrl+Alt+U构建工程重构工程Ctrl+Alt+I重新构建工程
总条数:949 到第
上滑加载中