当前位置: 首页 > 编程日记 > 正文

《Java虚拟机规范》阅读(三):Class文件格式

  每一个Class都对应着唯一的一个类或借口的定义信息。这里,我们称为"Class文件格式"只是通俗的将任意一个符合有效的类或借口的格式这么称呼,但是它并不一定是以磁盘文件的形式存在。

  每个Class文件都是由8字节为单位的字节流组成,所有的16位、32位和64位长度的数据将被构造成 2个、4个和8个8字节单位来表示。

ClassFile结构

  每一个Class文件对应于一个如下所示的ClassFile结构体。

ClassFile { 
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count; field_info fields[fields_count];
u2 methods_count; method_info methods[methods_count];
u2 attributes_count; attribute_info attributes[attributes_count];
}

  其中u1、u2、u4分别代表1、2、4个字节无符号数。

  magic:

  魔数,魔数的唯一作用是确定这个文件是否为一个能被虚拟机所接受的Class文件。魔数值固定为0xCAFEBABE,不会改变。

  minor_version、major_version:

  分别为Class文件的副版本和主版本。它们共同构成了Class文件的格式版本号。不同版本的虚拟机实现支持的Class文件版本号也相应不同,高版本号的虚拟机可以支持低版本的Class文件,反之则不成立。

  constant_pool_count:

  常量池计数器,constant_pool_count的值等于constant_pool表中的成员数加1。

  constant_pool[]:

  常量池,constant_pool是一种表结构,它包含Class文件结构及其子结构中引用的所有字符串常量、类或接口名、字段名和其它常量。常量池不同于其他,索引从1开始到constant_pool_count -1。

  access_flags:

  访问标志,access_flags是一种掩码标志,用于表示某个类或者接口的访问权限及基础属性。access_flags的取值范围和相应含义见下表:

this_class:

  类索引,this_class的值必须是对constant_pool表中项目的一个有效索引值。constant_pool表在这个索引处的项必须为CONSTANT_Class_info类型常量,表示这个Class文件所定义的类或接口。

  super_class:

  父类索引,对于类来说,super_class的值必须为0或者是对constant_pool表中项目的一个有效索引值。如果它的值不为0,那constant_pool表在这个索引处的项必须为CONSTANT_Class_info类型常量,表示这个Class文件所定义的类的直接父类。当然,如果某个类super_class的值是0,那么它必定是java.lang.Object类,因为只有它是没有父类的。

  interfaces_count:

  接口计数器,interfaces_count的值表示当前类或接口的直接父接口数量。

  interfaces[]:

  接口表,interfaces[]数组中的每个成员的值必须是一个对constant_pool表中项目的一个有效索引值,它的长度为interfaces_count。每个成员interfaces[i] 必须为CONSTANT_Class_info类型常量。

  fields_count:

  字段计数器,fields_count的值表示当前Class文件fields[]数组的成员个数。

  fields[]:

  字段表,fields[]数组中的每个成员都必须是一个fields_info结构的数据项,用于表示当前类或接口中某个字段的完整描述。

  methods_count:

  方法计数器,methods_count的值表示当前Class文件methods[]数组的成员个数。

  methods[]:

  方法表,methods[]数组中的每个成员都必须是一个method_info结构的数据项,用于表示当前类或接口中某个方法的完整描述。

  attributes_count:

  属性计数器,attributes_count的值表示当前Class文件attributes表的成员个数。

  attributes[]:

  属性表,attributes表的每个项的值必须是attribute_info结构。

  下面举个简单的例子来说明一下ClassFile的结构:

public class HelloWorld
{
String str = "";

public String getStr()
{
return str;
}

public void setStr(String str)
{
this.str = str;
}

}

  通过javap工具我们能看到这个简单的类的结构,如下:


  我们可以看到一些信息包括主副版本号、常量池、ACC_FLAGS等,再来打开Class文件看一下:


  根据前面所述的ClassFile结构,我们来分析下:  


  可以看到前4个字节为魔数,也就是0xCAFEBABE,这里都是十六进制。


  魔数后2个字节为副版本号,这里副版本号是0.


  再后2个字节是主版本号0x0033,转为十进制,主版本号是51,和Javap工具所看到的一样,这里我用的JDK版本是1.7。


  这两个字节是常量池计数器,常量池的数量为0x0017,转为十进制是23,也就是说常量池的索引为1~22,这与Javap所看到的也相符。
  常量池计数器后面就是常量池的内容,我们根据javap所看到的信息找到最后一个常量池项java/lang/Object,在字节码中找到对应的地方:

常量池后面两个字节是访问标志access_flags:

值为0x0021,在javap中我们看到这个类的标志是

  其中ACC_PUBLIC的值为0x0001,ACC_SUPER的值为0x0020,与字节码是相匹配的。
  至于ClassFile的其他结构,包括this_class、super_class、接口计数器、接口等等都可以通过同样的方法进行分析,这里就不再多说了。

  下面将详细的介绍一下ClassFile结构中的中的各个部分。

常量池

  所有的常量池项都具有如下通用格式:

cp_info 
{
  u1 tag;
  u1 info[];
}

  以1个字节的tag开头,后面info[]项的内容tag由的类型所决定。tag有效的类型和对应的取值如下表:

下面我们来介绍下不同类型的tag所对应的结构和规则:

  CONSTANT_Class_info结构:

  CONSTANT_Class_info结构用于表示类或接口,格式如下:

CONSTANT_Class_info 
{
u1 tag;
u2 name_index;
}

  CONSTANT_Class_info结构的tag项的值为CONSTANT_Class(7)。name_index项的值,必须是对常量池的一个有效索引。常量池在该索引处的项必须是CONSTANT_Utf8_info结构,代表一个有效的类或接口二进制名称的内部形式。

  CONSTANT_Fieldref_info, CONSTANT_Methodref_info和CONSTANT_InterfaceMethodref_info结构:

字段,方法和接口方法由类似的结构表示:

CONSTANT_Fieldref_info 
{
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_Methodref_info
{
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
CONSTANT_InterfaceMethodref_info
{
u1 tag;
u2 class_index;
u2 name_and_type_index;
}

 CONSTANT_Fieldref_info结构的tag项的值为CONSTANT_Fieldref(9)。

  CONSTANT_Methodref_info结构的tag项的值为CONSTANT_Methodref(10)。 CONSTANT_InterfaceMethodref_info结构的tag项的值为CONSTANT_InterfaceMethodref(11)

  class_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Class_info结构,表示一个类或接口,当前字段或方法是这个类或接口的成员。
  name_and_type_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_NameAndType_info结构,它表示当前字段或方法的名字和描述符。
  CONSTANT_String_info结构:

CONSTANT_String_info用于表示java.lang.String类型的常量对象,格式如下:

CONSTANT_String_info 
{
u1 tag;
u2 string_index;
}

CONSTANT_String_info结构的tag项的值为CONSTANT_String(8)。string_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示一组Unicode码点序列,这组Unicode码点序列最终会被初始化为一个String对象。

  CONSTANT_Integer_info和CONSTANT_Float_info结构:

  CONSTANT_Intrger_info和CONSTANT_Float_info结构表示4字节(int和float)的数值常量: 

CONSTANT_Integer_info 
{
u1 tag;
u4 bytes;
}
CONSTANT_Float_info
{
u1 tag;
u4 bytes;
}

  CONSTANT_Integer_info结构的bytes项表示int常量的值,按照Big-Endian的顺序存储。 CONSTANT_Float_info结构的bytes项按照IEEE 754单精度浮点格式。表示float常量的值,按照Big-Endian的顺序存储。

  CONSTANT_Long_info和CONSTANT_Double_info结构:

  CONSTANT_Long_info和CONSTANT_Double_info结构表示8字节(long和double)的数值常量:

CONSTANT_Long_info 
{
u1 tag;
u4 high_bytes;
u4 low_bytes;
}
CONSTANT_Double_info
{
u1 tag;
u4 high_bytes;
u4 low_bytes;
}

  在Class文件的常量池中,所有的8字节的常量都占两个表成员(项)的空间。如果一个CONSTANT_Long_info或CONSTANT_Double_info结构的项在常量池中的索引为n,则常量池中下一个有效的项的索引为n+2,此时常量池中索引为n+1的项有效但必须被认为不可用。

  CONSTANT_Long_info结构的tag项的值是CONSTANT_Long(5)。 CONSTANT_Double_info结构的tag项的值是CONSTANT_Double(6)。

  CONSTANT_Long_info结构中的无符号的high_bytes和low_bytes项用于共同表示long型常量,构造形式为((long) high_bytes << 32) + low_bytes,high_bytes和low_bytes都按照Big-Endian顺序存储。 CONSTANT_Double_info结构中的high_bytes和low_bytes共同按照IEEE 754双精度浮点格式表示double常量的值。high_bytes和low_bytes都按照Big-Endian顺序存储。

  CONSTANT_NameAndType_info结构:

  CONSTANT_NameAndType_info结构用于表示字段或方法,但是和前面介绍的三个表示字段方法的结构不同,CONSTANT_NameAndType_info结构没有标识出它所属的类或接口,格式如下:

CONSTANT_NameAndType_info 
{
u1 tag;
u2 name_index;
u2 descriptor_index;
}

  CONSTANT_NameAndType_info结构的tag项的值为CONSTANT_NameAndType(12)。

  name_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf8_info结构,这个结构要么表示特殊的方法名<init>,要么表示一个有效的字段或方法的非限定名。
  descriptor_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf8_info(§4.4.7)结构,这个结构表示一个有效的字段描述符或方法描述符。

  CONSTANT_Utf8_info结构:

  CONSTANT_Utf8_info结构用于表示字符串常量的值:

CONSTANT_Utf8_info 
{
u1 tag;
u2 length;
u1 bytes[length];
}

  CONSTANT_Utf8_info结构的tag项的值为CONSTANT_Utf8(1)。length项的值指明了bytes[]数组的长度,bytes[]是表示字符串值的byte数组。

  CONSTANT_MethodHandle_info结构:

  CONSTANT_MethodHandle_info结构用于表示方法句柄,结构如下:

CONSTANT_MethodHandle_info 
{
u1 tag;
u1 reference_kind;
u2 reference_index;
}

  CONSTANT_MethodHandle_info结构的tag项的值为CONSTANT_MethodHandle(15)。reference_kind项的值必须在1至9之间(包括1和9),它决定了方法句柄的类型。

  reference_index项的值必须是对常量池的有效索引,索引项和reference_kind的对应关系如下:

  

  CONSTANT_MethodType_info结构:

  CONSTANT_MethodType_info结构用于表示方法类型:

CONSTANT_MethodType_info 
{
u1 tag;
u2 descriptor_index;
}

  CONSTANT_MethodType_info结构的tag项的值为CONSTANT_MethodType(16)。descriptor_index项的值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示方法的描述符。

  CONSTANT_InvokeDynamic_info结构:

  CONSTANT_InvokeDynamic_info用于表示invokedynamic指令所使用到的引导方法、引导方法使用到动态调用名称、参数和请求返回类型、以及可以选择性的附加被称为静态参数的常量序列。

CONSTANT_InvokeDynamic_info 
{
u1 tag;
u2 bootstrap_method_attr_index;
u2 name_and_type_index;
}

  CONSTANT_InvokeDynamic_info结构的tag项的值为CONSTANT_InvokeDynamic(18)。bootstrap_method_attr_index项的值必须是对当前Class文件中引导方法表的bootstrap_methods[]数组的有效索引。ame_and_type_index项的值必须是对当前常量池的有效索引,常量池在该索引处的项必须是CONSTANT_NameAndType_info结构,表示方法名和方法描述符。

  下面我们还是使用上面ClassFile的例子来简单看下常量池:

通过javap我们看到常量池中第一项为: 

  

   是HelloWorld的初始化方法,再来看一下字节码:

  

   0A是第一个常量池项的tag,转为十进制是10,查找上面的常量类型表的确是CONSTANT_Methodref类型常量。

  根据CONSTANT_Methodref_info的结构,tag后2个字节为class_index,为常量池的某个可用索引,索引项必须为CONSTANT_Class_info结构:

  

  0x0005,转为十进制是5。索引位置5的常量为:

  

  可以看到是Object类,Java中所有的类都是Object类的子类。HelloWorld类没有显示的定义构造方法,会自动调用父类Object的无参构造方法。

  继续看CONSTANT_Methodref_info的结构的第三个属性name_and_type_index,为常量池的某个可用索引,索引项必须为CONSTANT_NameAndType_info结构:

0x0012,转为十进制是18。索引位置18的常量为:

  

  包括前面的索引5的CONSTANT_Class_info结构和这里的CONSTANT_NameAndType_info结构我们都可以继续追踪下去,这里我只是做简单分析就不再往下了。

  用同样的方法可以分析常量池里每一个常量。

字段

  每个字段(Field)都由field_info结构所定义,在同一个Class文件中,不会有两个字段同时具有相同的字段名和描述符。

  field_info结构格式如下: 

field_info
{
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}

  access_flags项的值是用于定义字段被访问权限和基础属性的掩码标志。取值范围如下表:

name_index项的值必须是对常量池的一个有效索引。常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示一个有效的字段的非全限定名。

  descriptor_index项的值必须是对常量池的一个有效索引。常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示一个有效的字段的描述符。

  attributes_count的项的值表示当前字段的附加属性的数量。

  attributes表的每一个成员的值必须是attribute结构,一个字段可以有任意个关联属性。

方法

所有方法(Method),包括实例初始化方法和类初始化方法在内,都由method_info结构所定义。在一个Class文件中,不会有两个方法同时具有相同的方法名和描述符。

  method_info结构格式如下:

method_info 
{
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}

  access_flags项的值是用于定义当前方法的访问权限和基本属性的掩码标志,取值范围如下表:

  标记名        值        说明

    ACC_PUBLIC     0x0001     public,方法可以从包外访问

  ACC_PRIVATE    0x0002     private,方法只能本类中访问

  ACC_PROTECTED  0x0004     protected,方法在自身和子类可以访问

  ACC_STATIC     0x0008     static,静态方法

  ACC_FINAL      0x0010     final,方法不能被重写(覆盖)

  ACC_SYNCHRONIZED     0x0020     synchronized,方法由管程同步

  ACC_BRIDGE     0x0040     bridge,方法由编译器产生

  ACC_VARARGS     0x0080     表示方法带有变长参数

  ACC_NATIVE     0x0100     native,方法引用非java语言的本地方法

  ACC_ABSTRACT   0x0400     abstract,方法没有具体实现

  ACC_STRICT     0x0800     strictfp,方法使用FP-strict浮点格式

  ACC_SYNTHETIC   0x1000     方法在源文件中不出现,由编译器产生

  name_index项的值必须是对常量池的一个有效索引。常量池在该索引处的项必须是CONSTANT_Utf8_info结构。

  descriptor_index项的值必须是对常量池的一个有效索引。常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示一个有效的方法的描述符。

  attributes_count的项的值表示这个方法的附加属性的数量。attributes表的每一个成员的值必须是attribute结构,一个方法可以有任意个与之相关的属性。

属性:

  属性(Attributes)在Class文件格式中的ClassFile结构、field_info 结构,method_info结构和Code_attribute结构都有使用,所有属性的通用格式如下:

attribute_info 
{
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}

  对于任意属性,attribute_name_index必须是对当前Class文件的常量池的有效16位无符号索引。常量池在该索引处的项必须是CONSTANT_Utf8_info结构,表示当前属性的名字。attribute_length项的值给出了跟随其后的字节的长度,这个长度不包括attribute_name_index和attribute_name_index项的6个字节。
  对于字段、方法、和属性的结构,我们很容易的可以通过javap工具查看到。


关于Class文件的验证可能会放到后面Java虚拟机加载类的过程中学习。

转载于:https://www.cnblogs.com/zhuYears/archive/2012/02/07/2340347.html

相关文章:

【spring】自动装配

山顶洞人方法&#xff1a;aotowire UserDao.java 代码实现&#xff1a; public class UserDao {private DBUtil dbu;public DBUtil getDbu() {return dbu;}public void setDbu(DBUtil dbu) {this.dbu dbu;}public void test() {System.out.println(dbu);} }DBUtil.java 代…

扩展jquery实现客户端表格的分页、排序

下面链接中是我用jQuery的扩展来实现的表格分页和排序&#xff0c;使用这个扩展必须加上表头<thead>和<tbody>标签&#xff0c;因为我是 通过<tbody>来进行分页的&#xff0c;要是不加thead&#xff0c;那么表头也要作为分页计算时的一个行了。 下载最新代码…

Win7中如何删除word模板

Win7中如何删除word模板 计算机→本地磁盘c盘→用户→Administrator→AppData→Roaming→Microsoft→Templates转载于:https://blog.51cto.com/ilanni/555302

Spring 学习笔记

Spring 的 Ioc 容器所有的组件都是被动的&#xff08; Passive&#xff09;&#xff0c;所有的组件初始化和调用都由容器负责。组件处在一个容器当中&#xff0c;由容器负责管理。BeanFactory 根据配置文件确定容器中 bean 的实现&#xff0c;管理 bean 之间的依赖关系。通常&a…

【spring】初识aop(面向切面编程) 使用jdk动态代理

BankServiceIImple.java 代码实现&#xff1a; package com.zzxtit.aop;import java.math.BigDecimal;public interface BankServiceImple {public void transfer(String source, String target, BigDecimal money);public void withdraw(String account, BigDecimal money);…

sigaction

#include <signal.h> int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); struct sigaction {   void (*sa_handler)(int);   void (*sa_sigaction)(int, siginfo_t *, void *);   sigset_t sa_mask;   int sa_flags;   void …

003本周总结报告

本周对java的循坏结构和条件语句以及switch分支进行了复习并通过九九乘法表和制作日历来更加熟练使用和理解循环&#xff0c;并用eclipse替代了记事本来编写程序&#xff0c;同时针对记事本编写java程序后台运行出现的GBK不可映射字符问题先后采用了 javac -encoding UTF-8 …

HDU-1203 I NEED A OFFER!-0、1背包及空间优化

I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5280 Accepted Submission(s): 1799Problem DescriptionSpeakless很早就想出国&#xff0c;现在他已经考完了所有需要的考试&#xff0c;准备了…

docker监控系统

第一&#xff1a;docker监控系统之命令行式监控 第二&#xff1a;docker监控系统之cadvisor 第三&#xff1a;docker监控系统之 第四&#xff1a;docker监控系统之 转载于:https://www.cnblogs.com/fengjunhua/p/8968210.html

Visual Studio 2005 Team System下载地址

注册一个msn就可以去微软下载了&#xff0c;关于替换序列号变成正版的方法我没有试&#xff0c;team suite我在用&#xff0c;但Team Foundation Server 我还没有安装好Microsoft Visual Studio 2005 简体中文正式版Visual Studio 2005 Team Suite 180 天试用版(可更换key变为正…

【spring】springAop开发

xml开发方式 springboot的使用 1、声明一个parent 代码实现&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.0.RELEASE</version><relati…

使用 SqlHelperParameterCache 类管理参数

SqlHelperParameterCache类是位于 Microsoft.ApplicationBlocks.Data命名空间底下。它底下有三个方法&#xff0c;分别是&#xff1a; CacheParameterSet&#xff1a;用于将SqlParameters 数组存储到缓存中GetCachedParameterSet&#xff1a;用于检索读取缓存中SqlParameters数…

改善C#程序的建议6:在线程同步中使用信号量

所谓线程同步&#xff0c;就是多个线程之间在某个对象上执行等待&#xff08;也可理解为锁定该对象&#xff09;&#xff0c;直到该对象被解除锁定。C#中对象的类型分为引用类型和值类型。CLR在这两种类型上的等待是不一样的。我们可以简单的理解为在CLR中&#xff0c;值类型是…

Jerry眼中的SAP客户数据模型

本文Jerry将介绍八款SAP产品中的客户模型。希望您在阅读完本文之后&#xff0c;能对SAP客户模型设计的思路有一个最最粗浅的了解。 由于Jerry水平和精力所限&#xff0c;本文不会详细阐述这些产品里的客户模型设计细节&#xff0c;而是介绍了一种方法&#xff0c;如果您对这些模…

【spring】spring JDBC开发 、 将创建表生成sql语句的方法

将navicate中已存在表的创建转化成sql语句的方法 1、右击表&#xff0c;选择对象信息 2、点击DDL jar包引入 1、spring-starter-jdbc 代码实现&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

PL/SQL ——分页编程

通过PL/SQL编程&#xff0c;编写分页存储过程。代码如下所示&#xff1a; 1 --PL/SQL开发编写分页代码 2 --创建包 3 create or replace package Page as 4 type test_cursor is ref cursor 5 end Page; 6 --创建存储过程 7 create or replace procedure Page( 8 (tablenam…

My view towards Machine Learning

Introduction:[to be continued]转载于:https://www.cnblogs.com/JVKing/articles/2290780.html

两个表的更新、表的复制

update 表1 set from 表1&#xff0c;表2 where 条件 表的复制数据 1.select * into newtable from table 2.insert into table select table2 select identity(int,1,1),* into newtable from .. 这条语句有时挺管用的转载于:https://www.cnblogs.com/leshang/archive/2…

Java数据结构简述

1、数组 概念&#xff1a;一个存储元素的线性集合。 数组声明和创建&#xff1a; dataType[] arrayRefVar new dataType[arraySize]; 二维数组&#xff08;多维数组&#xff09;声明和创建&#xff1a; dataType[][] arrayName new dataType[arraylenght1][arraylenght2]; PS…

CORS漏洞利用检测和利用方式

CORS全称Cross-Origin Resource Sharing, 跨域资源共享&#xff0c;是HTML5的一个新特性&#xff0c;已被所有浏览器支持&#xff0c;不同于古老的jsonp只能get请求。 检测方式&#xff1a; 1.curl访问网站   curl https://www.huasec.com -H "Origin: https://test.com…

【spring】具名参数

具名参数 配置xml文件 1、配置dataSource&#xff08;数据源&#xff09; 代码实现&#xff1a; <context:property-placeholderlocation"DB.properties"></context:property-placeholder><bean id"dataSource"class"com.alibaba.d…

利用委托和泛型实现树的常用操作

在日常开发中&#xff0c;经常遇到对树的操作&#xff0c;我们可以利用泛型和委托对这些树进行操作&#xff0c;这样就不需要每有一个树就要实现相应的功能了。 源码在http://files.cnblogs.com/haiconc/LangTest.zip 首先&#xff0c;使用类泛型声明&#xff1a; public class…

Scott的ASP.net MVC框架系列文章之四:处理表单数据(2)

前几周我发表了一系列文章介绍我们正在研究的ASP.NET MVC框架。ASP.NET MVC框架为你提供了一种新的开发Web应用程序的途径&#xff0c;这种途径可以让应用程序变得更加层次清晰&#xff0c;而且更加有利于对代码进行单元测试和支持TDD&#xff08;测试驱动开发&#xff09;开发…

eclipse工作空间配置导出

由于工作与学习的需求&#xff0c;需要使用不同的工作空间。而eclipse的新建工作空间其他以前的配置都没有继承过来&#xff0c;那么就得重新配置一遍。 经过学习其他前辈们的经验与自己的摸索总结一下3种方法&#xff1a; 方法一&#xff1a;使用eclipse的导出功能。 工作目录…

探讨UnsupportedOperationException的原因及解决方案

[原文链接]{https://blog.csdn.net/liu_005/article/details/74091805} 转载于:https://www.cnblogs.com/Wbin01/p/11222483.html

成长轨迹44 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2799、2976、2975、2742】...

一次ac的就不说啥了。。 2799:浮点数格式 View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 #include <cmath> 5 6 char flo[10050][55]; 7 int poi[10050]; 8 9 int main()10 {11 int num;12 scanf("%d…

【转载】xmind的使用安装方法

原文链接&#xff1a;https://blog.csdn.net/qq_16093323/article/details/80967867

BCB Access violateion at Address 0000 0003. Read of address 0000 0003

来自网页&#xff1a;&#xff08;我的电脑做不到&#xff09; 运行一个程序&#xff0c;莫名出现一个对话框:access violation at address 0000.. read of address000试了几次问题依旧&#xff0c;网上搜了下解决办法&#xff1a;原文&#xff1a;baidu&#xff0b;google&…

与 Scott Guthrie 一道感受技术激情 1月13日于北京

可能很多朋友已经知道了这个消息&#xff0c;我觉得还是写一下&#xff0c;别让这个机会白白溜走。Scott Guthrie是谁&#xff0c;我就不介绍了&#xff0c;简单说&#xff1a;ASP.NET之父&#xff0c;Silverlight 的主要创始人&#xff0c;还管着太多微软的开发技术和工具&…

【web】将一个jar包更改成war包

可以看到&#xff0c;向tomcat中发布工程刚创建的工程不在可添加的范围内&#xff0c;所以可以看出该工程是一个jar包 1、在pom文件中添加一行代码 代码实现&#xff1a; <artifactId>jar.to.war</artifactId> 2、更新maven工程 此时发现main文件夹下出现了一个w…