-
麒麟系统默认的yum源只提供java 1.8,项目要求只能使用Java 1.7,请问如何在麒麟系统上安装java 1.7呢?
-
ObjectOutputStream构造方法ObjectOutputStream(OutputStream out)创建一个写入指定的OutputStream的ObjectOutputStream对象成员方法void writeObject(Object obj)将指定的对象写入ObjectOutputStream示例代码import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;public class ObjectOutputStreamTest1 { public static void main(String[] args) throws IOException { User user1 = new User("tangsan","123456"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io-practice\\user1.txt")); oos.writeObject(user1); oos.close(); }}ObjectInputStream构造方法ObjectInputStream(InputStream in)创建从指定的InputStream读取的ObjectInputStream成员方法Object readObject()从ObjectInputStream读取一个对象示例代码import java.io.FileInputStream;import java.io.IOException;import java.io.ObjectInputStream;public class ObjectInputStreamTest1 { public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io-practice\\user1.txt")); //此处ois读取出来的数据是Object类型的,需要强转为User类型 User user1 = (User) ois.readObject(); //System.out.println(user1.toString()); System.out.println(user1); ois.close(); }}
-
obs java sdk 之前上传有效期为1天,现在想修改已上传的文件为永久有效? 可以吗?
-
数组是相同数据类型的元素的有序集合。为什么说是有序的呢?访问数组元素是通过数组下标进行的,下标从0开始,依次递增直到 length - 1(length为数组长度),所以可以理解为有序的。首先,来谈谈如何初始化数组?两种初始化方法:动态初始化、静态初始化。(这里以一维数组为例)//动态初始化int[] arr1 = new int[9];//声明了一个数组长度为9的一维数组//除了上面的初始化方式,还可以拆分为两步int[] arr2;arr2 = new int [9];//这两种都属于动态初始化,只是方式存在差异//静态初始化,声明数组长度为5的一维数组int[] arr3 = new int[]{1,2,3,4,5};//静态初始化的标准格式//也可以分为两步初始化//int[] arr3;//arr3 = new int[]{1,2,3,4,5};int[] arr4 = {1,2,3,4},5;//静态初始化的省略格式,不能分为两步既然声明了一个数组,那么数组是储存在哪里的呢?当使用"new"关键字创建数组对象后,会在堆中为数组分配相应的内存空间。总的来说,就是当你使用"new"关键字创建一个对象时,就会在堆中为该对象分配相应的内存空间。数组初始化,那么如何访问数组元素进行赋值和获取元素值呢?int[] arr = new int[5];//数组元素的值默认为0//数组元素赋值for(int i = 0; i < 5; i++){arr = 1;//这里就将数组下标为i的元素赋值为1}//既然对数组赋值了,那么如何获取数组元素的值System.out.println(arr);//这样是否会输出数组元素的值呢//答案是不会,这样输出的是数组的内存地址哈希值[I@#########]//方括号代表是数组,大写字母I代表为整型,后面的#则是十六进制数//这里介绍一种循环:for each循环for(int x:arr){System.out.println(x);//这样就能输出数组元素的值了,当然你也可以使用普通的for循环来进行访问//for(int i = 0; i < 5; i++){//System.out.println(arr);//}}以上就是Java数组中关于一维数组的简单介绍。
-
Java的发展从1995年开始经历了许多的过程,但是有三个最具有代表性的JDK版本;JDK1.0:标志着java的诞生;JDK1.2:加入了javax.swing组件,这是主要新特性;JDK1.5:标记为tiger,出现了许多一直沿用至今的特性;JDK1.8:Lambda表达式、接口的定义加强已经接触过了一些新特性,例如:自动装箱与拆箱、switch对String的判断支持。
-
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("程序无法执行!!!!"); }}
-
>摘要:log4j远程代码漏洞问题被大范围曝光后已经有一段时间了,今天完整讲清JNDI和RMI以及该漏洞的深层原因。本文分享自华为云社区[《升级过log4j,却还没搞懂log4j漏洞的本质?为你完整讲清jndi、rmi以及该漏洞的深层原因!》](https://bbs.huaweicloud.com/blogs/317342?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=other&utm_content=content),作者:breakDraw。 log4j远程代码漏洞问题被大范围曝光后已经有一段时间了。 很多人只能看到一个“弹出一个计算器”的演示,于是内心想着“哦,就是执行任意代码,启动个计算器”,却对这个漏洞的原理不甚了解。  而对于java开发应用不是非常深的同学来讲,jndi、rmi更是很陌生的名词。 这里会以不断提问的方式,逐步推进这个问题的解答,一步步揭开这个漏洞的本质,并给出对这个漏洞的思考。 Q:log4j里的”${}“符号是什么?有什么用? A:可以通过${}的方式,打印一些特殊的值到日志中。 例如${hostName}就可以打印主机名 ${java:vm}打印jvm信息 ${thread:threadName}就可以打印线程名 当你把这个值作为日志的参数,就会打印出来这些值而非原参数名字。 可以理解为log4j的功能更强大了,不需要自己写java代码来打印这些信息,直接用一个字符串就能搞定这些打印。 上面这些都是要实现对应的Lookup类才能做的,即要么log4j内置,要么我们自己新增。 Q:上面这个打印本机信息的是漏洞的原因吗?看起来好象可以在机器里执行奇怪的命令?或者查看文件路径? A:不是的。 上面这些lookup,都是事先定义好的一些loopup字符,并不能做任意的事情!而且就算你发了这些${java.vm}啥的,也只能在服务端打印和收集,你作为攻击者,是收集不到这些信息的 真正的原因,是因为log4j支持的${jndi:xxxx},即支持jndi进行lookup来寻找对象并打印。 Q:什么是JNDI? A:JavaNamingandDirectoryInterface(JAVA命名和目录接口) 简单说就是可以通过JNDI,在java环境中用一个名字,去lookup寻找一个东西使用。 例如可以直接在自己的Java环境中配置一个数据库连接,名字叫“java:MySqlDS” 然后别的java进程通过jndi去查找”java:MysqlDs“,接着就会得到一个数据库连接。 这样如果1个机器有多个进程,都要用同一个连接,完全可以修改整个java环境的jndi数据库对象,然后其他进程就能同时生效了。 Connectionconn=null; //Context就是jdni的类 Contextctx=newInitialContext(); //jndi关键方法,通过loopup找一个对象 ObjectdatasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源 DataSourceds=(Datasource)datasourceRef; conn=ds.getConnection(); ...... c.close(); 除了数据库连接,他还支持loopup找dns,可以弄一个dnsContext然后寻找”sun.com“对应的dns对象 使用JNDI进行高级DNS查询 这样log4j里就可以通过${jndi:dns:http://huaweicloud.com}来获取当前机器中http://huaweicloud.com对应的域名对象进行打印,来确认网络请求失败时,是否是dns获取有问题。 这也就是log4j为啥要引入jndi的原因,可以更方便地获取一些可打印的对象进行日志统计。 然而,jndi还支持通过RMI/LDAP+url字符串,来寻找并获取一个远程对象。 这个寻找远程对象的操作,就是此次漏洞的核心问题所在。 这里只讲RMI。LDAP类似,就不再论述。 Q:RMI是什么? A:RMI,RemoteMethodInvocation。 具体含义: - 远程服务器实现具体的Java方法并提供接口 - 客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法 在RMI中,实际上就是返回了一个stub(桩)调用对象给客户端,然后客户都用这个stub对象去做远程调用。 这样客户端就不用关心背后网络怎么写的 **甚至不用知道对方服务是什么端口或者ip** 因此也不需要写sokect的一堆方法搞半天了,也避免了总是修改访问的url啥的。 具体过程如下:  1. Server端监听一个端口,这个端口是JVM随机选择的; 2. Client端并不知道Server远程对象的通信地址和端口,但是Stub中包含了这些信息,并封装了底层网络操作; 3. Client端可以调用Stub上的方法; 4. Stub连接到Server端监听的通信端口并提交参数; 5. 远程Server端上执行具体的方法,并返回结果给Stub; 6. Stub返回执行结果给Client端,从Client看来就好像是Stub在本地执行了这个方法一样; Q:RMI客户端不需要关心服务端的监听端口?那客户端从哪里拿到stub对象呢?总不可能凭空生成吧 A:服务端那边可以启动一个RMI注册中心服务RMIRegistry,端口设置为统一的1099,ip也是固定的。 然后当客户端希望拿到某个服务例如订单服务order的stub对象时,就用”order“这个名字到RMI注册中心上去请求这个stub 这样的话,客户端只需要知道RMI注册中心即可,不需要知道其他服务的ip、端口,非常节省管理成本。 服务端代码长这样: //建立一个订单服务通信桩 OrderServerStubstub=newOrderServerStub(); //启动一个RMI注册中心,端口为1099 LocateRegistry.createRegistry(1099); //把OrderServer这个桩,注册到rmi://0.0.0.0:1099/order这个url上 Naming.bind("rmi://0.0.0.0:1099/order",stub); 客户端的代码长这样,可以看到一个loopup就把这个桩找过来了。 然后就能直接调用stub里的queryOrder方法查询订单了! Registryregistry=LocateRegistry.getRegistry("kingx_kali_host",1099); OrderServerStubstub=(OrderServerStub)registry.lookup("hello"); stub.queryOrder("aaa");  Q:那JNDI和RMI又是什么关系?怎么就联系到一起了 A:上面的代码里,可以看到RMI需要自己写一段Java代码执行。 如果以后你不用RMI来存这个通信对象了,而是用LDAP之类的,咋办?难道代码都要重新写然后部署一份吗? 而如果能用JNDI的方式,通过一个小小的字符串,就能拿到,那就简单了。 那么当我需要切换通信对象的获取方式时,切换JDNI里的设置即可。 而RMI正好实现了JNDI的spi接口,以至于能支持用JNDI+字符串去获取对象  这里贴一下SPI的概念: SPI,全称为ServiceProviderInterface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。 这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制 - 说人话,spi就是框架方提供一个interface接口,然后只要有人在服务的class发现路径下写一个实现类,就能在代码里直接用上。 而log4j里,正好就支持用${jndi:rmi:x.x.x.x:1099/path}的方式进行RMI对象的获取。 log4j开发者可能本意只是方便用jndi获取各种java容器内置对象,没想到忽略了rmi的获取方式。 **这就导致了我们的服务可能会访问黑客部署的RMI服务,获取到一个不可信的远程调用对象。** Q:但是刚才提到,我们只会通过RMI去拿到一个stub, stub里的内容仅仅是通过特定的ip+port去做发送,代码是固定的 再怎么恶意的命令,也只会在**RMI注册中心即黑客的服务器**上执行,怎么就在我这边触发了攻击? 而且这个stub对象的class文件在我们服务器本地并没有,难道不会报classNotFind异常吗? A:某个讲RMI注入的文章里这样说道: RMI服务端除了直接绑定远程对象之外,还可以通过References引用类来绑定一个外部的远程对象(当前名称目录系统之外的对象)。 绑定了Reference之后,服务端会先通过Referenceable.getReference()获取绑定对象的引用,并且在目录中保存。当客户端在lookup()查找这个远程对象时,客户端会获取相应的objectfactory,最终通过factory类将reference转换为具体的对象实例。 - 说人话,就是RMI允许客户端的java环境中没有这个stub对象 - RMI服务端(那个1099端口的服务)他会返回给你一个factory(序列化传过来),让你调用这个factory做转换。而这个可被序列化生成的factory就是问题的根本原因。 整个利用流程如下: 1. 目标代码中调用了InitialContext.lookup(URI),且URI为用户可控; 2. 攻击者控制URI参数为恶意的RMI服务地址,如:rmi://hacker_rmi_server//name; 3. 攻击者RMI服务器向目标返回一个Reference对象,Reference对象中指定某个精心构造的Factory类; 4. 目标在进行lookup()操作时,会动态加载并实例化Factory类,接着调用factory.getObjectInstance()获取外部远程对象实例; 5. 攻击者可以在Factory类文件的构造方法、静态代码块、getObjectInstance()方法等处写入恶意代码,达到RCE的效果; Q:那么log4j-core2.15版本又是怎么改的呢? A:限定jndi使用的协议,禁止在jndi中用ldap、rmi去调用一些远端的服务。 # 思考 说实话,这个漏洞影响之所以这么大,就是因为原理太过简单,随便发一段rmi注册中心的demo和客户端调用demo给别人,他就能复现,甚至用这个方式去攻击。 为什么log4j的设计者当时没有考虑到呢? 很大概率可能是因为jndi的spi机制扩展性太强。 也许最初,jndi只支持dns、数据库driver等对象的命名获取 但是后来随着版本更新,JNDP通过SPI机制,支持了RMI、LDAP等实现,而这个是log4j开发者当时没考虑到的。 换句话说,这是**java高可扩展性和安全性的一次冲突**,因此JNDI的调用方式,未来应该会被更加谨慎地使用了。
-
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("程序无法执行!!!!"); }}
-
springboot 使用 java-transport-client 读写 FusionInsight HD 6.5.1 安全模式 ES 6.7.1 ,刚启动服务时可以正常读写 ES ,但过一段时间后就报错,错误堆栈如下认证代码复制于样例已替换下面三个包,请问是否替换正确elasticsearch-transport-clientelasticsearchtransport
-
不同的编程语言会对我们的求职产生相当大的影响,但是目前哪种编程语言最受公司欢迎呢?Emsi Burning Glass收集并分析了数百万个招聘信息,以下是出现得最多的编程语言:图来源于Emsi Burning Glass如图所示, SQL 位居榜首,可见各大公司在招聘时往往倾向于能够熟练使用SQL的技术人员。比起Python、Java 和JavaScript等编程语言,SQL并非使用最广泛的语言。但是,之所以各大公司要求精通SQL,原因在于它能够用于管理和查询关系数据库,是数据操作的基础。Java位列第二位。最近推出的Java 17在性能上大幅度提高,同时稳定性和安全性也在不断升级。该语言为众多软件后端提供支持,其中包括Android应用程序和大数据分析等等。Burning Glass表示,这也是Java 开发人员工资较高的关键原因之一。第三名编程语言为Python。Python一直是一种非常流行的编程语言,如今逐步用于数据科学、机器学习和其他高度专业化的领域。开发者调查分析公司 SlashData表示,Python的全球开发者社区人数大约有1130万,并且仍在持续增长。文章来源:https://blog.csdn.net/csdndevelopers/article/details/122316758
-
新年将至,正是重新再出发的好时候。如果要学一门新的编程语言,该从哪个开始入手呢?不如来看下编程语言风向标:2021年最佳编程语言排行榜!近日,IEEE Spectrum发布的2021年度编程语言排行榜,与2020年排行榜相比,Python、Java、C、C++ 和JavaScript 依然占据 2021 排行榜的前 5 名。而在TIOBE编程语言社区发布的12月编程语言排行榜中,Python、C、Java、C++、C#也名列排行榜前5名,都展示出非常火热的发展势头。*图片来源于IEEE Spectrum、TIOBE编程语言没有好坏之分,重点在于应用。各技术社区编程语言排行榜,是编程语言流行趋势的一个指标,可以帮助程序员更好的了解自己所学的编程语言在市场中的竞争力。对于新入门及需要掌握多门编程语言的程序员来说,了解当下编程语言的热门程度是非常有必要的。免费精品课程推荐接下来给大家介绍一下排行前列且较稳定,最值得程序员学习的几个开发语言,同时给大家推荐一些适合自学的免费精品课程。稳居榜首的PythonPython是时下最为流行的编程语言之一,在诸多领域都有着广泛的应用;其优雅的语法、简单的规则让程序员在更短的时间内实现更多的功能。众所周知的JavaJava是目前使用最为广泛的网络编程语言之一,具有易学好用的特点,基于对象的编程更符合人的思维模式,使人们更容易编写程序;与平台无关是 Java 语言最大的优势。经久不衰的C语言当今主流编程语言中,C语言的历史最为悠远且经久不衰,在程序语言发展史上具有重要地位。C语言偏向于底层硬件交互,多用于系统软件开发,设备驱动开发以及嵌入式开发。其中著名的UNIX操作系统就是由C语言所开发。主导性非常强的C++C++是一门被广泛使用的现代编程语言,在兼顾性能和灵活的原则下拥有大量特性,它非常灵活,功能也非常强大,是可以在保证功能的前提下性能最高的语言之一。因互联网而生的JavaScriptJavaScript是一种在网络浏览器上运行的变成语言,这种语言我们称之为脚本语言。它因互联网而生,紧跟浏览器的发展而发展。开发语言大讲堂华为云培训中心官方推出Python,Java,C,C++,Rust,JavaScript等免费精品课程。非常适合打算自学编程语言,或者仅有部分闲暇时间学习编程语言的学员。由华为云专家精心打造课程配合“课程+测评+实战+认证”四步帮助你0基础从入门到精通通过自主“学测练考”不仅能让你对开发语言有整体概念还可以帮助你培养编程思维!此外,通过学习,还可获取华为云官方认证证书,赢取富士INSTAX 一次成像相机、京东3D颈肩按 摩披肩、无线榨汁机、充电宝、帆布包、无线鼠标等1000+好礼!扫描下方二维码了解详情活动日期:即日起截至3月27日课程免费、实验免费奖品有限,发完即止还等什么,马上占位吧!
-
【功能模块】【操作步骤&问题现象】1、能否提供一个调用yarnclient的接口提交应用到RM的java样例demo,感谢【截图信息】【日志信息】(可选,上传日志内容或者附件)
-
【问题来源】【必填】 星网 【问题简要】【必填】java版本漏洞【问题类别】【必填】 aicc【AICC解决方案版本】【必填】 aicc8.141【期望解决时间】【选填】尽快【问题现象描述】【必填】 用户提出了一个Apache Log4j远程代码执行漏洞的问题,Apache log4j 2.2.0至2.14.1版本都会有影响,解决方法为升级至Apache Log4j 2所有相关应用到最新的 log4j-2.15.0-rc1 版本,不知道aicc使用java有没有关联这个东西,如果使用是否版本已经没有这个漏洞 【日志或错误截图】【可选】
-
java用jdbc连openGauss,出现报错:Unsupported major.minor version 52.0 (无法载入的.类 [org.postgresql.Driver])是什么原因?环境:java jdk是1.7 Tomcat用的8.x版本
-
https://education.huaweicloud.com/programs/1ecdf4b3-15db-4ca4-b1b9-8026effafc4c/about
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签