Java class文件格式之属性详解

合集下载

java中类的用法

java中类的用法

java中类的用法Java是一种面向对象的编程语言,类是面向对象编程的基本概念之一。

在Java中,类是一种模板,它用来描述一类对象的方法和属性。

可以通过创建类的对象来使用它的方法和属性。

本文将介绍Java中类的用法。

一、定义类Java中定义类的语法如下:```java public class ClassName { // 类的成员变量 // 类的构造函数 // 类的方法 } ```其中,类名要遵循标识符的命名规范。

类的成员变量是类的属性,它们用于存储对象的状态。

类的构造函数用于创建对象并初始化它的成员变量。

类的方法用于定义对象的行为。

二、成员变量Java中的成员变量也称为类的属性,用于存储对象的状态。

成员变量可以是基本类型、引用类型或数组类型。

在类的定义中,成员变量要放在构造函数和方法的前面。

成员变量可以通过类的对象来访问和修改。

```java public class Person { private String name; private int age;public Person(String name, int age){ = name; this.age = age; }public String getName() { return name; }public void setName(String name){ = name; }public int getAge() { return age; }public void setAge(int age){ this.age = age; } } ```在上面的例子中,Person类有两个成员变量name和age,它们都使用private关键字修饰,表示只能在类内部访问。

同时,这个Person类提供了一个有参构造函数和getter、setter方法,用来访问和修改成员变量。

三、构造函数Java中的构造函数用于创建对象并初始化它的成员变量。

Java class文件格式之数据类型(二)

Java class文件格式之数据类型(二)

Java class文件格式之数据类型(二)常量池中各数据项类型详解(续)(8) CONSTANT_Class_info常量池中的一个CONSTANT_Class_info,可以看做是CONSTANT_Class数据类型的一个实例。

他是对类或者接口的符号引用。

它描述的可以是当前类型的信息,也可以描述对当前类的引用,还可以描述对其他类的引用。

也就是说,如果访问了一个类字段,或者调用了一个类的方法,对这些字段或方法的符号引用,必须包含它们所在的类型的信息, CONSTANT_Class_info就是对字段或方法符号引用中类型信息的描述。

CONSTANT_Class_info的第一个字节是tag,值为7,也就是说,当虚拟机访问到一个常量池中的数据项,如果发现它的tag值为7,就可以判断这是一个CONSTANT_Class_info 。

tag下面的两个字节是一个叫做name_index的索引值,它指向一个CONSTANT_Utf8_info,这个CONSTANT_Utf8_info中存储了CONSTANT_Class_info要描述的类型的全限定名。

此外要说明的是,java中数组变量也是对象,那么数组也就有相应的类型,并且数组的类型也是使用CONSTANT_Class_info描述的,并且数组类型和普通类型的描述有些区别。

普通类型的CONSTANT_Class_info中存储的是全限定名,而数组类型对应的CONSTANT_Class_info中存储的是数组类型相对应的描述符字符串。

举例说明:与Object类型对应的CONSTANT_Class_info中存储的是:java/lang/Object与Object[]类型对应的CONSTANT_Class_info中存储的是:[Ljava/lang/Object;下面看CONSTANT_Class_info的存储布局:例如,如果在一个类中引用了System这个类,那么就会在这个类的常量池中出现以下信息:(9) CONSTANT_Fieldref_info常量池中的一个CONSTANT_Fieldref_info,可以看做是CONSTANT_Field数据类型的一个实例。

java项目文件结构描述格式

java项目文件结构描述格式

java项目文件结构描述格式当我们开始一个新的Java项目时,良好的文件结构是非常重要的。

一个清晰的文件结构可以让我们更容易地组织和管理代码,提高团队协作效率,同时也方便新成员快速熟悉项目结构。

下面是一个常见的Java项目文件结构描述格式:1. src,源代码目录。

main,主要源代码目录。

java,Java源文件目录。

com,包名。

example,示例。

MyClass.java,Java类文件。

resources,资源文件目录。

config,配置文件目录。

static,静态资源文件目录。

templates,模板文件目录。

test,测试源代码目录。

java,测试Java源文件目录。

com,包名。

example,示例。

MyClassTest.java,测试类文件。

resources,测试资源文件目录。

2. lib,依赖库目录。

jar,第三方JAR包。

native,本地库文件。

3. build,构建输出目录。

classes,编译后的class文件。

libs,打包后的JAR文件。

4. docs,文档目录。

design,设计文档。

api,API文档。

readme.md,项目说明文档。

5. config,配置文件目录。

application.properties,应用配置文件。

log4j.properties,日志配置文件。

6. .gitignore,Git忽略文件配置。

7. README.md,项目说明文档。

8. pom.xml,Maven项目配置文件。

9. build.gradle,Gradle项目配置文件。

以上是一个常见的Java项目文件结构描述格式,当然在实际项目中可能会根据具体需求有所不同。

然而,一个清晰的文件结构可以让我们更好地管理项目,提高代码质量和团队协作效率。

希望这个文件结构描述能够帮助到你。

Java类的属性与方法 PPT

Java类的属性与方法 PPT

方法调用
• 方法是个“黑匣子”,完成某个特定的应用程序功能,并返回结果 • 方法调用:执行方法中包含的语句
对象名.方法名();
小明过生日,爸爸送他一个电动狮子玩具,编程测试这个狮子能否正常工作
方法调用
public class LionTest { public static void main(String[ ] args) {
类的方法
按此按钮, 狮子开始跑
电动玩具狮子 属性: 颜色:黄色
行为: 跑 叫
• 写出狮子对象的“跑”方法 • 写出狮子对象的“叫”方法
类的方法示例
AutoLion类代码实现
访问类型
public class Au返to回Lio类n型{ String color = "黄色";
方法名称
public void run(){ System.out.println("正在以0.1米/秒的速度向前奔跑");
Phone Student= new Student() ;
12
public Student()
{
}
方法的主体
方法的命名
• 如何给方法起名字? – 只能以字母、‘_’或‘$’开头 – 可以包括数字,但不能以它开头
• 遵循的命名规范 – 通常方法名是一个动词,如果有两个以上单词组成,第一个单词的种情况 – 如果方法具有返回值,方法中必须使用关键字return返回该值,返回类型为该返回 值的类型
} }
方法调用案例
• 编写成绩计算类(ScoreCalc) • 编写测试类
成绩计算类 测试类
编程实践
– 编写手机类(Phone):它可以下载音乐,可以播放这些音乐,可以进行充电

java class 指令部分

java class 指令部分

java class 指令部分Java Class指令是用于定义类的关键指令。

在Java中,每个类都必须使用class关键字进行定义。

本文将详细介绍Java Class指令的使用方法和注意事项。

一、Java Class指令的基本语法在Java中,使用class关键字定义类。

其基本语法如下所示:```[访问修饰符] class 类名 {// 类的成员变量和方法}```其中,访问修饰符可以是public、private、protected或默认的包级访问权限。

类名是标识符,遵循命名规则,且首字母大写。

二、Java Class指令的使用方法1. 定义类的成员变量:在类中使用变量声明语句定义类的成员变量。

可以使用不同的数据类型,如int、double、String等。

2. 定义类的方法:在类中使用方法声明语句定义类的方法。

方法可以有不同的访问修饰符和返回值类型,可以有参数列表和方法体。

3. 创建类的对象:在类外部使用new关键字创建类的对象,并调用对象的方法或访问对象的成员变量。

三、Java Class指令的注意事项1. 类名必须与文件名相同,并且扩展名为.java。

2. 一个源文件中可以定义多个类,但只能有一个public类。

3. 类的成员变量和方法可以使用不同的访问修饰符,以控制对其的访问权限。

4. 类的成员变量通常使用private修饰,通过公有的get和set方法来访问和修改。

5. 类的方法可以通过重载和重写来实现不同的功能。

6. 类的构造方法在创建对象时自动调用,用于初始化对象的成员变量。

7. 类的继承使用extends关键字,子类可以继承父类的成员变量和方法。

8. 类的多态性通过接口和抽象类来实现,提高了代码的灵活性和可维护性。

四、Java Class指令的示例代码下面是一个简单的示例代码,演示了Java Class指令的使用方法:```javapublic class Person {private String name;private int age;public Person(String name, int age) { = name;this.age = age;}public void sayHello() {System.out.println("Hello, my name is " + name + ", I am " + age + " years old.");}public static void main(String[] args) {Person person = new Person("T om", 20);person.sayHello();}}```以上代码定义了一个Person类,包含了成员变量name和age,以及构造方法和sayHello方法。

Java语言中的Class类

Java语言中的Class类

Java语⾔中的Class类基本概念在Object类中定义了以下的⽅法,此⽅法将被所有⼦类继承public final Class getClass()这个⽅法的返回值类型是⼀个Class类,此类是Java反射的源头,是实际上所谓反射从程序的运⾏结果来看也很好理解,即:可以通过对象反射求出类的名称。

对象照镜⼦后可以得到的信息:某个类的属性、⽅法和构造器、某个类到底实现了哪些接⼝。

对于每个类⽽⾔,JRE都为其保留⼀个不变的Class类型的对象。

⼀个Class对象包含了特定某个结构(class、interface、enum、annotation、primitive type、void)的有关信息。

Class本⾝也是⼀个类Class对象只能由系统建⽴对象⼀个加载的类在JVM中只会有⼀个Class实例⼀个Class对象对应的是⼀个加载到JVM中的⼀个.class⽂件每个类的实例都会记得⾃⼰是由哪个Class实例所⽣成通过Class可以完整地得到⼀个类中的所有被加载结构Class类是Reflection的根源,针对任何你想动态加载、运⾏的类,唯有先获得相应的Class对象。

Java中拥有Class对象的类型在Java语⾔中,⼀切皆是对象。

⽽对象主要分为两种,⼀种是普通类创建的实例对象,⼀种是Class类对象。

每个类运⾏时的类型信息就是通过Class对象表⽰的,这个对象包含了与类有关的信息。

其实Java中的实例对象就是通过Class对象来创建的,Java使⽤Class对象执⾏其RTTI(运⾏时类型识别,Run-Time Type Identification),多态是基于RTTI实现的。

那么在Java中哪些类型可以有Class对象呢?class:外部类、成员(成员内部类、静态内部类)、局部内部类、匿名内部类interface:接⼝[]:数组enum:枚举annotation:注解@interfaceprimitive type:基本数据类型void我们⽤代码演⽰⼀下,这些类型的Class对象都是什么?Class c1 = Object.class; // 类Class c2 = Comparable.class; // 接⼝Class c3 = String[].class; // ⼀维数组Class c4 = int[][].class; // ⼆维数组Class c5 = Override.class; // 注解Class c6 = ElementType.class; // 枚举Class c7 = Integer.class; // 基本数据类型(包装类)Class c10 = int.class; // 基本数据类型Class c8 = void.class; // 空类型Class c9 = Class.class; // ClassSystem.out.println(c1); // class ng.ObjectSystem.out.println(c2); // interface parableSystem.out.println(c3); // class [ng.String;System.out.println(c4); // class [[ISystem.out.println(c5); // interface ng.OverrideSystem.out.println(c6); // class ng.annotation.ElementTypeSystem.out.println(c7); // class ng.IntegerSystem.out.println(c10);// intSystem.out.println(c8); // voidSystem.out.println(c9); // class ng.Classint[] a = new int[10];int[] b = new int[100];/*对于数组,只要元素类型与维度⼀样,就是同⼀个Class对象*/System.out.println(a.getClass()); //class [ISystem.out.println(b.getClass()); //class [ISystem.out.println(b.getClass().hashCode()); //1735600054System.out.println(a.getClass().hashCode()); //1735600054每⼀个类都有⼀个Class对象,每当编译⼀个新类就产⽣⼀个Class对象,更准确的来说,是被保存在⼀个同名的.class⽂件中。

Java的class是什么意思

Java的class是什么意思

一、class类有什么用?
class类的实例表示Java应用运行时的类(class ans enum)或接口(interface and annotation)(每个java类运行时都在JVM里表现为一个class对象,可通过类名.class,类型.getClass(),Class.forName("类名")等方法获取class对象)。

数组同样也被映射为为class 对象的一个类,所有具有相同元素类型和维数的数组都共享该Class 对象。

基本类型boolean,byte,char,short,int,long,float,double和关键字void同样表现为class 对象。

二、class类的特征
class类没有公有的构造方法,它由JVM自动调用(在new对象或者加载-classLoader 时)。

下面的方法作用是打印出对象的class name:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
同样可以根据class literal 获得class name:
System.out.println("The name of class Foo is: "+Foo.class.getName());//你可以将Foo改为void尝试下。

class文件与dex文件解析

class文件与dex文件解析

class⽂件与dex⽂件解析关于Android的热修复与插件化技术在如今基本上已经成为了“时髦技术”的标配了,或者说⽤来进⾏“炫技”的⼀种⽅式,毕境如今Android已经发展得⾮常之成熟了,基本上APP⽤的到东东都差不多,除了业务不同之外,但是!对于热修复与插件化并不是每个公司或者每个程序员愿意去应⽤到商⽤项⽬上的,因为既使不加它貌似对传统APP 的开发也⽊有啥影响,毕境加它还是有些繁锁的,⽽不管有没有在商⽤APP上去集成过它们,并不影响它被众多开发者所追捧,如今去⾯个试我想被问到热修复与插件化相关的技术问题应该只多不少,⽽且还得让你去对它底层的原理进⾏⼀些阐述,如果不需要⾯试也得有必要去掌握这⼀技术,因为毕境能集成到⾃⼰的APP上是能够实际解决APP的⼀些问题的,基于此有必要系统的去探究,彻底掌握它们,所以接下来会从基础开始⼀点点去揭开它神秘的⾯纱。

对于Dex⽂件是能够在Android被执⾏的⼀种格式,⽽它是由class⽂件进⾏演变过来的,在android的热修复中是需要涉及到Dex⽂件之间的⼀个diff操作的,⽽它的基础就是得对其⽂件结构有⼀定的了解,所以这⾥基础就先来熟悉⼀下⽂件结构。

class⽂件解析:什么是class⽂件:能够被JVM识别,加载并执⾏的⽂件格式。

如何⽣成⼀个class⽂件:是不是只有java⽂件才能够⽣成class⽂件呢?其实不是的,看下⾯这张图就晓得了:对于class⽂件的⽣成⼀般是由两种⽅式来完成的:IDE⾃动⽣成、javac命令,这⾥主要是演⽰⼀下javac命令的⽅式,对于它在我们学习j2se的时候已经经历过了,这⾥再来温故⼀下:新建⼀个最简单的java⽂件,⾥⾯内容如下:然后编译⽣成class字节码⽂件:然后运⾏:另外对于javac命令还可以指令编译的JDK版本,如下:class⽂件的作⽤:⽤⼀句话描述:“记录⼀个类⽂件的所有信息”,class⽂件的信息是远远多于java源代码的信息的,⽐如说我们在写java代码时并没有定义"this"、"super"关键字,但是确能够使⽤它们去调⽤当前类的⽅法或⽗类的⽅法,这是因为在⽣成class字节码⽂件的时候JVM帮我们记录了this和super关键字,所以从这点也能体会到class字节码⽂件的信息要远远多于Java源代码所看到的信息。

class的基本原理

class的基本原理

class的基本原理在Java中,class的基本原理可以概括为以下几点:1. Class对象:Class对象包含了与类相关的信息。

事实上,Class对象就是用来创建类的所有“普通”对象的。

类是程序的一部分,每个类都有一个Class对象。

每当编写并且编译了一个新类,就会产生一个Class对象,这个对象被保存在一个同名的.class文件中。

在运行时,当想生成这个类的对象时,Java虚拟机(JVM)首先检查这个类的Class对象是否已经加载。

如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。

一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

2. 静态代码块:在Class对象中,存在一个静态代码块,用于初始化静态变量。

当类被加载时,静态代码块会被执行。

3. 类加载机制:Java使用类加载机制来动态加载类。

当一个类首次被引用时,JVM会加载这个类。

如果这个类的Class对象尚未加载,JVM就会查找.class文件并加载它。

4. 字节码:Java源代码在编译后会生成字节码。

这些字节码包含类的信息,可以被JVM执行。

由于字节码是跨平台的,因此Java程序可以在任何安装了JVM的平台上运行。

5. 继承:在Java中,类可以继承另一个类的属性和方法。

这使得子类可以复用父类的代码,并可以添加或覆盖父类的行为。

6. 封装:在Java中,类的成员(变量和方法)被封装在类内部。

这意味着这些成员只能被类的其他成员访问。

这种封装机制有助于隐藏对象的内部状态,并控制对它的访问。

7. 多态:多态是Java的一个重要特性,它允许一个接口或基类的引用变量被多个不相关的子类对象赋值。

以上就是Java中class的基本原理。

理解这些原理有助于更好地理解Java 的面向对象编程模型和Java程序的工作方式。

java基础篇——对象的定义格式

java基础篇——对象的定义格式

1.引言J a va是一种面向对象的编程语言,对象是J av a程序设计的核心概念之一。

在Ja va中,我们可以通过定义对象来描述现实世界中的事物,并对其进行操作。

本文将介绍J av a中对象的定义格式。

2.对象的定义格式在J av a中,我们可以使用`cl as s`关键字来定义一个对象。

对象的定义格式通常包括以下几个部分:2.1类的声明首先,我们需要使用`cl as s`关键字来声明一个类。

类是对象的模板,用于定义对象的属性和行为。

p u bl ic cl as sC la ssN a me{//类的成员变量和方法在这里定义}在上面的代码中,`C l as sN am e`是类的名称,可以根据具体需求进行命名,同时请注意类名的首字母大写和驼峰命名法的规范。

2.2类的成员变量类的成员变量用于描述对象的属性。

成员变量可以是任意合法的数据类型,如整数、浮点数、字符、字符串等。

p u bl ic cl as sC la ssN a me{//成员变量的定义d a ta Ty pe va ri ab leN a me;}在上面的代码中,`d a ta Ty pe`表示成员变量的数据类型,`v ar ia bl eN am e`表示成员变量的名称。

2.3类的方法类的方法用于定义对象的行为。

方法是一段可执行的代码,可以接收参数和返回值。

p u bl ic cl as sC la ssN a me{//...//方法的定义r e tu rn Ty pe me th odN a me(p ar am et er Typ e pa ra me te r){//方法的具体实现}}在上面的代码中,`r e tu rn Ty pe`表示方法的返回值类型,`m et ho dN am e`表示方法的名称,`p ar am e te rT yp e`表示方法的参数类型,`p ar am et er`表示方法的参数。

2.4类的构造方法构造方法是一种特殊的方法,用于创建对象并初始化对象的成员变量。

运行java的class文件方法详解

运行java的class文件方法详解

运⾏java的class⽂件⽅法详解⼀、运⾏class⽂件执⾏带main⽅法的class⽂件,命令⾏为:java <CLASS⽂件名>注意:CLASS⽂件名不要带⽂件后缀.class例如:复制代码代码如下:java Test如果执⾏的class⽂件是带包的,即在类⽂件中使⽤了:package <包名>那应该在包的基路径下执⾏,命令⾏为:java <包名>.CLASS⽂件名例如:PackageTest.java中,其包名为:com.ee2ee.test,对应的语句为:package com.ee2ee.test;PackageTest.java及编译后的class⽂件PackageTest.class的存放⽬录如下:classes|__com|__ee2ee|__test|__PackageTest.java|__PackageTest.class要运⾏PackageTest.class,应在classes⽬录下执⾏:复制代码代码如下:java com.ee2ee.test.PackageTest⼆、运⾏jar⽂件中的class原理和运⾏class⽂件⼀样,只需加上参数-cp <jar⽂件名>即可。

例如:执⾏test.jar中的类com.ee2ee.test.PackageTest,命令⾏如下:复制代码代码如下:java -cp test.jar com.ee2ee.test.PackageTest三、显⽰jdk版本信息当⼀台机器上有多个jdk版本时,需要知道当前使⽤的是那个版本的jdk,使⽤参数-version即可知道其版本,命令⾏为:复制代码代码如下:java -version四、增加虚拟机可以使⽤的最⼤内存java虚拟机可使⽤的最⼤内存是有限制的,缺省值通常为64MB或128MB。

如果⼀个应⽤程序为了提⾼性能⽽把数据加载内存中⽽占⽤较⼤的内存,⽐如超过了默认的最⼤值128MB,需要加⼤java虚拟机可使⽤的最⼤内存,否则会出现Out of Memory(系统内存不⾜)的异常。

java程序来解析class文件,实现反编译

java程序来解析class文件,实现反编译

[B01][java程序解析class文件]Type:[B01][Solution]Submit:[abc@][2012.11.06][V1.00]From:/jtf975/blog/static/18135128720112612517429/我们都知道,Java编译器负责将.java文件编译成.class文件,class文件存储的是java字节码,与.java 文件无关(只要你愿意写一个编译器,也可以将别的语言写的源代码编译成.class文件),本文预备具体解剖class文件的内部结构,并且把class文件结构读取并显示出来。

Class文件的格式由JVM规范规定,一共有以下部分:1. magic number,必须是0xCAFEBABE,用于快速识别是否是一个class文件。

2. version,包括major和minor,假如版本号超过了JVM的识别范围,JVM将拒尽执行。

3. constant pool,常量池,存放所有用到的常量。

4. access flag,定义类的访问权限。

5. this class和super class,指示如何找到this class和super class。

6. inte***ces,存放所有inte***ces。

7. fields,存放所有fields。

8. methods,存放所有methods。

9. attributes,存放所有attributes。

先写一个Test.java:package example.test;public final class TestClass {public int id = ;public void test() {}}公司地址:北京海淀区彩和坊路10号1+1大厦3层100080然后编译,放在C:\Documents and Settings\Administrator\桌面\解析class文件\TestClass.java。

java 类参数

java 类参数

java 类参数Java是一种面向对象的编程语言,类是其基本的程序设计单元。

在Java中,类可以包含属性和方法,这些属性和方法都会被类的对象所继承。

当我们创建一个Java类时,我们需要为它添加一些参数,这些参数也被称为类的成员变量。

在本文中,我们将深入讨论Java类参数。

1. 定义Java类在Java中,我们可以使用关键字"class"来定义一个类。

类定义的基本语法如下:```public class ClassName {// 成员变量// 构造函数// 成员方法}```通过上述语法,我们可以定义一个Java类,其中包括成员变量、构造函数和成员方法。

类参数即指这些成员变量。

2. Java类参数的数据类型Java类参数可以是任何Java数据类型,包括基本数据类型和引用数据类型。

基本数据类型包括byte、short、int、long、float、double、char、boolean,而引用类型包括String、数组、类、接口等。

例如,下面的代码表示一个Person类,其中包括了三个成员变量:name、age和gender,分别为String、int和char类型。

```public class Person {String name;int age;char gender;// 构造函数// 成员方法}```3. Java类参数的访问修饰符在Java中,我们可以使用访问修饰符来限制成员变量的访问权限。

Java提供了四种访问修饰符:public、private、protected和default。

- public修饰符:可以被同一个包中的其他类、不同包中的子类和实例对象访问。

- private修饰符:只能被本类的成员方法访问。

- protected修饰符:可以被同一个包中的其他类、不同包中的子类和本类的成员方法访问。

- default修饰符:只能被同一个包中的其他类访问。

例如,下面的代码将name属性设置为public修饰符,age属性和gender属性分别设置为private和protected修饰符。

Java中泛型ClassT、T与Class?、Object类和Class类、object.。。。

Java中泛型ClassT、T与Class?、Object类和Class类、object.。。。

Java中泛型ClassT、T与Class?、Object类和Class类、object.。

⼀.区别单独的T 代表⼀个类型(表现形式是⼀个类名⽽已),⽽ Class<T>代表这个类型所对应的类(⼜可以称做类实例、类类型、字节码⽂件), Class<?>表⽰类型不确定的类Class<T>表⽰T类型的字节码⽂件,意思是:Class<T> 相当于Class<T> c=T.class,T t new T() ;或者Class<T> c= t.getClass();通过以上可以获取类名为c.getName();解释:Class<T> ct=T.class,T t new T() ; 与Class c=T.class,T t new T() ;ct泛型指的是ct只能是T的字节码,⽽c可以是任何类的字节码。

所以⽤ct⽤法更好E - Element (在集合中使⽤,因为集合中存放的是元素)T - Type(Java 类)K - Key(键)V - Value(值)N - Number(数值类型)- 表⽰不确定的java类型举例说明:Set<T> 表⽰集合⾥是 T类的实例List<E> 表⽰集合⾥是 E类的实例List<?> 表⽰集合⾥的对象类型不确定,未指定List 同 List<?> 是⼀样的。

的作⽤: 1、⽤泛型:Java代码收藏代码List<T> list=new ArrayList<T>();T t=list.get(0); 2、不⽤泛型:Java代码收藏代码List list=new ArrayList();T t=(T).get(0);⼆、如何创建⼀个Class<T>类型的实例?就像使⽤⾮泛型代码⼀样,有两种⽅式:调⽤⽅法 Class.forName() 或者使⽤类常量X.class。

java中class用法

java中class用法

java中class用法Java是一种面向对象的编程语言,class是Java中表示类的一种重要语法结构。

在Java中,类是一种抽象概念,它描述了一个对象的属性和方法。

通过使用class关键字,我们可以定义一个类,并使用它来创建类的实例,即对象。

在Java中,class用法主要包括定义类、创建对象、访问属性和方法等。

一、定义类在Java中,使用class关键字定义一个类,需要使用类名、属性(变量)和构造方法等语法元素。

1.类名:类名是用来标识类的一种名称,必须遵循Java命名规范,并且具有唯一性。

2.属性(变量):属性是用来描述对象状态的一种数据类型,可以是基本数据类型、对象引用或数组等。

3.构造方法:构造方法是用来创建对象的一种特殊方法,它的名称必须与类名相同,没有返回类型。

在构造方法中,可以定义对象的初始状态,包括属性的赋值等。

下面是一个简单的Java类的定义示例:```javapublicclassPerson{privateStringname;privateintage;publicPerson(Stringname,intage){=name;this.age=age;}}```上述代码定义了一个名为Person的类,它有两个属性:name和age,以及一个构造方法。

在构造方法中,我们为name和age属性进行了赋值。

二、创建对象定义了一个类之后,就可以使用该类来创建对象的实例。

在Java 中,创建对象需要使用类名加上括号来调用构造函数。

例如:```javaPersonperson=newPerson("张三",20);```上述代码创建了一个Person类的对象person,并调用了Person 类的构造函数来初始化该对象。

三、访问属性和方法创建了对象之后,就可以通过对象来访问其属性和方法。

在Java 中,访问对象的属性和方法需要使用对象名加上点符号(.)来调用。

class在java中的用法

class在java中的用法

class在java中的用法在Java中,Class是一个特殊的数据类型,用于表示类的字节码。

它提供了一种机制,允许程序在运行时获取类的相关信息,并且可以通过该类的实例创建对象。

以下是Class在Java中的几个重要用法:1. 获取Class对象:通过Java的反射机制,可以在运行时获得一个类的Class对象。

可以使用两种方式来获取Class对象:- 使用类名.class语法:例如,如果要获取String类的Class对象,可以使用String.class方式。

- 使用对象的getClass()方法:例如,如果有一个String类型的对象str,可以使用str.getClass()方法来获取String类的Class对象。

2. 创建对象:通过Class对象,可以在运行时动态创建一个类的实例。

使用Class对象的newInstance()方法可以创建一个类的对象。

例如,可以使用String.class.newInstance()创建一个新的String对象。

3. 获取类的字段和方法:Class提供了一些方法,可以获取类的字段和方法的相关信息。

例如,可以使用getFields()方法获取类的公共字段,使用getMethods()方法获取类的公共方法。

还可以使用getField()和getMethod()方法获取指定的字段和方法。

4. 调用方法:通过Class对象,可以通过方法名称和参数类型,动态调用类中的方法。

使用Method类的invoke()方法来实现。

例如,可以使用Class对象获取指定方法,然后使用invoke()方法调用该方法。

5. 获取类的继承关系:Class对象提供了一些方法,可以获取类的继承关系的信息。

例如,可以使用getSuperclass()方法获取类的父类,使用getInterfaces()方法获取类实现的接口。

总结:在Java中,Class是非常重要的一个类,它提供了丰富的方法来获取类的相关信息,并且可以在运行时动态创建对象和调用方法。

java类的格式定义

java类的格式定义

java类的格式定义Java类的定义格式如下:[修饰符]class 类名[extends 父类名][implements 接口名]其中,各个部分的含义如下:1. 修饰符:可以是public,也可以不写(默认)。

修饰符用于指定类的访问权限,例如public表示类可以被其他类访问,private表示类只能在当前类中访问。

2. 类名:类名首字母需大写,并符合标识符的命名规则。

类名通常表示一类对象的抽象概念,如人类、车辆等。

3. extends:用于说明所定义的类继承于哪个父类。

如果不需要继承其他类,可以省略extends关键字。

4. 父类名:表示当前类继承的父类的名称。

如果不需要继承其他类,可以省略extends关键字。

5. implements:用于说明当前类实现了哪些接口。

如果不需要实现接口,可以省略implements关键字。

6. 类体:类体是大括号({})中的内容,主要包括类的成员变量和成员方法。

成员变量用于描述对象的特征,如姓名、年龄等;成员方法用于表示对象的行为,如学习、工作等。

以下是一个简单的Java类定义示例:```javapublic class Person {// 成员变量String name;int age;String gender;// 成员方法void study() {System.out.println("正在学习");}void work() {System.out.println("正在工作");}}```在这个示例中,我们定义了一个名为Person的类,它包括三个成员变量(name、age、gender)和两个成员方法(study、work)。

这个类表示一个人的抽象,包括其姓名、年龄、性别以及学习和工作的行为。

2.class文件详解

2.class文件详解

如果它的值不为0,那constant_pool 表在这个索引处的项必须为CONSTANT_Class_info类型常量,表示这个Class文件所定义的类的直接父类。 当前类的直接父类,以及它所有间接父类的access_flag中都不能带有ACC_FINAL标记。对于接口来说,它的Class文件的super_class项的值必须是对constant_pool表中项目的 一个有效索引值。constant_pool表在这个索引处的项必须为代表ng.Object的CONSTANT_Class_info类型常量 。 如果Class文件的super_class的值为0 那这个Class文件只可能是定义的是ng.Object类,只有它是唯一没有父类的类.
有很多可以观察ByteCode的方法: 1.javap -v 命令 2.JClassLib ----IDEA的插件之一,非常方便 注意事项: 常量池计数器默认从1开始而不是从0开始: 当constant_pool_count = 1时,常量池中的cp_info个数为0;当constant_pool_count为n时,常量池中的cp_info个数为n-1。 原因: 在指定class文件规范的时候,将索引#0项常量空出来是有特殊考虑的,这样当:某些数据在特定的情 况下想表达“不引用任何一个常量池项”的意思时,就可以将其引用的常量的索引值设置为#0来表示。 常量池数据区
属性表,attributes 表的每个项的值必须是attribute_info结构。 在Java 7 规范里,Class文件结构中的attributes表的项包括下列定义的属性: InnerClasses、 EnclosingMethod 、 Synthetic 、Signature、SourceFile,SourceDebugExtension、Deprecated、RuntimeVisibleAnnotations 、RuntimeInvisibleAnnotations以 及BootstrapMethods属性。 对于支持 Class 文件格式版本号为 49.0 或更高的 Java 虚拟机实现,必须正确识别并读取attributes表中 的Signature、RuntimeVisibleAnnotations和RuntimeInvisibleAnnotations属性。 对于支持Class文件格式版本号为 51.0 或更高的 Java虚拟机实现,必须正确识别并读取 attributes表中的BootstrapMethods属性。 Java 7 规范 要求任一 Java 虚拟机实现可以自动忽略 Class 文件的 attributes表中的若干 (甚至全部) 它不可识别的属性项。 任何本规范未定义的属性不能影响Class文件的语义,只能提供附加的描述信息。

class的格式

class的格式

class的格式
Class文件是一组以8位字节为基础的二进制流。

根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种结构只用两种数据类型:无符号数和表。

无符号数以u1、u2、u4、u8分别来代表1、2、4、8个字节的无符号数。

表是由多个无符号数或者其他表为数据项组成的复合数据类型,习惯以“_info”结尾。

Class文件格式包含以下数据项:
1. 魔数(魔数用于判断是否可以被虚拟机支持)和版本。

2. 常量池(常量池是最大的数据项,也是第一个使用表类型数据项)。

常量池主要存放两个类常量:字面量和符号引用。

3. 访问标示(用于识别一些类或者接口层次的访问信息,例如public、private、abstract、final等)。

4. 类、父类、接口、字段、方法、属性等。

Class文件中的字节码指令由一个操作码和操作数组成,代表某些特殊的操作,例如对象创建new、检查类实列类型指令instanceof、类型转换指令等。

此外,还包括控制指令如if,异常指令等。

如需了解更多关于class的格式,建议阅读《深入理解Java虚拟机JVM高级特性与最佳实践》等书籍或请教专业人士。

CLASS属性

CLASS属性

CLASS属性
CLASS:
class 属性规定元素的类名;class 属性⼤多数时候⽤于指向样式表中的类
块级元素的宽⾼默认等于它的⽗元素,块级元素可以任意设置宽⾼
内联元素的宽⾼取决于内容,并且不能设置宽⾼
盒模型:
每⼀个元素都是⼀个盒⼦
盒模型⽤边框围起来,分为内边距(也叫填充边距,于元素边框的内容的距离);外边距(元素和它的外部的边框);边框选择器:
选择器有:上下⽂选择器;后代选择器;直接⼦代择器;相邻兄弟选择器;属性选择器
p.*
选择P元素,并且P元素的class属性的值等于*
class属性的P元素的值等于*下的P元素
2019.5.9。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java class文件格式之属性详解
Code属性
code属性是方法的一个最重要的属性。

因为它里面存放的是方法的字节码指令,除此之外还存放了和操作数栈,局部变量相关的信息。

所有不是抽象的方法,都必须在method_info中的attributes中有一个Code属性。

下面是Code 属性的结构,为了更直观的展示Code属性和method_info的包含关系,特意画出了method_info:
下面依次介绍code属性中的各个部分。

attribute_name_index指向常量池中的一个CONSTANT_Utf8_info ,这个CONSTANT_Utf8_info 中存放的是当前属性的名字“Code” 。

attribute_length给出了当前Code属性的长度(不包括前六字节)。

max_stack指定当前方法被执行引擎执行的时候,在栈帧中需要分配的操作数栈的大小。

max_locals指定当前方法被执行引擎执行的时候,在栈帧中需要分配的局部表量表的大小。

注意,这个数字并不是局部变量的个数,因为根据局部变量的作用域不同,在执行到一个局部变量以外时,下一个局部变量可以重用上一个局部变量的空间(每个局部变量在局部变量表中占用一个或两个Slot)。

方法中的局部变量包括方法的参数,方法的默认参数this,方法体中定义的变量,catch语句中的异常对象。

关于执行引擎的相关内容会在后面的博客中讲到。

code_length指定该方法的字节码的长度,class文件中每条字节码占一个字节。

code存放字节码指令本身,它的长度是code_length个字节。

exception_table_length指定异常表的大小
exception_table就是所谓的异常表,它是对方法体中try-catch_finally的描述。

exception_table可以看做是一个数组,每个数组项是一个exception_info结构,一般来说每个catch块对应一个exception_info,编译器也可能会为当前方法生成一些exception_info。

exception_info的结构如下(为了直观的显示exception_info, exception_table和Code属性的关系,画出了Code属性,的话读者就会更清楚各个数据项之间的位置关系和包含关系):
下面讲解exception_info中的各个字段的意思。

start_pc是从字节码(Code属性中的code部分)起始处到当前异常处理器起始处的偏移量。

end_pc是从字节码起始处到当前异常处理器末尾的偏移量。

handler_pc是指当前异常处理器用来处理异常(即catch块)的第一条指令相对于字节码开始处的偏移量。

catch_type是一个常量池索引,指向常量池中的一个CONSTANT_Class_info数据项,该数据项描述了catch块中的异常的类型信息。

这个类型必须是ng.Throwable的或其子类。

所以可以总结,一个异常处理器(exception_info)的意思是:如果偏移量从start_pc到end_pc之间的字节码出现了catch_type描述的类型的异常,那么就跳转到偏移量为handler_pc的字节码处去执行。

如果catch_type为0,就代表不引用任何常量池项(再回顾一下,常量池中的项是从1开始计的),那么这个exception_info用于实现finally子句。

我们一直在介绍Code属性,只不过刚才进行了一个小插曲,介绍了Code属性中的exception_table中的exception_info 的详细信息。

下面我们继续介绍Code 属性中的其他信息,希望读者不要被绕晕了: )
attributes_count 表示当前Code 属性中存在的其他属性的个数。

现在我们知道,class中的属性,不仅会出现在顶层的class中,会存在field_info中,会存在method_info中,甚至还会出现在属性中。

attributes可以看做是一个数组,里面存放了Code属性中的其他属性。

Code 属性中可以出现的其他属性有LineNumberTable和LocalVariableTable 。

这两个属性会在下面介绍。

LineNumberTable属性
LineNumberTable属性存在于Code属性中,它建立了字节码偏移量到源代码行号之间的联系。

这个属性是可选的,编译器可以选择不生成该属性。

下面是该属性的结构(同样给出了全局的位置关系,LineNumberTable在图的右下角部分):
由于这个属性并不是重点,我们在此简单的讲述。

每个LineNumberTable中的line_number_table部分,可以看做是一个数组,数组的每项是一个line_number_info ,每个line_number_info 结构描述了一条字节码和源码行号的对应关系。

其中start_pc是这个line_number_info 描述的字节码指令的偏移量, line_number是这个line_number_info 描述的字节码指令对应的源码中的行号。

可以看出,方法中的每条字节码都对应一个line_number_info ,这些line_number_info 中的line_number可以指向相同的行号,因为一行源码可以编译出多条字节码。

LocalVariableTable属性
LocalVariableTable 属性建立了方法中的局部变量与源代码中的局部变量之间的对应关系。

这个属性存在于Code属性中。

这个属性是可选的,编译器可以选择不生成这个属性。

该属性的结构如下:(同样给出了全局的位置关系图,LocalVariableTable 在该图的右下角)
由于这个属性相对不那么重要,这里只是大概讲解一下。

每个LocalVariableTable 的local_variable_table部分可以看做是一个数组,每个数组项是一个叫做local_variable_info 的结构,该结构描述了某个局部变量的变量名和描述符,还有和源代码的对应关系。

下面讲解local_variable_info的各个部分:
start_pc是当前local_variable_info所对应的局部变量的作用域的起始字节码偏移量;
length是当前local_variable_info所对应的局部变量的作用域的大小。

也就是从字节码偏移量start_pc 到start_pc+length就是当前局部变量的作用域范围;
name_index指向常量池中的一个CONSTANT_Utf8_info,该CONSTANT_Utf8_info描述了当前局部变量的变量名;
descriptor_index指向常量池中的一个CONSTANT_Utf8_info,该CONSTANT_Utf8_info描述了当前局部变量的描述符;
index描述了在该方法被执行时,当前局部变量在栈帧中局部变量表中的位置。

由此可知,方法中的每个局部变量都会对应一个local_variable_info 。

Exceptions属性
首先需要说明,Exceptions属性不是存在于Code属性中的,它存在于method_info中的attributes中。

和Code属性是平级的。

这个属性描述的是方法声明的可能会抛出的异常,也就是方法定义后面的throws声明的异常列表,请不要和上面提到的异常处理器混淆。

异常处理器描述了方法的字节码如何处理异常,而Exceptions属性描述方法可能会抛出哪些以异常。

下面讲解Exceptions属性的结构(左下角为Exceptions属性):
下面讲解Exceptions属性中的信息。

attribute_name_index和attribute_length就不多说了,和其他属性是一样的。

number_of_exceptions是该方法要抛出的异常的个数。

exceptions_index_table可以看做一个数组,这个数组中的每一项占两个字节,这两个字节是对常量池的索引,它指向一个常量池中的CONSTANT_Class_info。

这个CONSTANT_Class_info描述了一个被抛出的异常的类型。

总结
到此为止,和方法相关的属性就介绍完了。

这篇博客讲解的内容相对比较复杂。

下面以一个实例进行验证,实例代码:
反编译后的test方法部分(省略了常量池等信息):
结合上面的讲解和图解,再分析反编译的结果,就一目了然了:所有的结果是一个method_info, method_info开始处是访问标志信息。

然后是method_info的 Exceptions属性, Exceptions属性属性下面是Code属性,Code属性中又包括字节码,异常处理器,LineNumberTable属性和LocalVariableTable 属性。

所以会直接或间接的和method_info有联系,最后给出一张全局图,这样的话,读者就比较明确,一个完整的方法,是如何在class文件中描述的,由于考虑到复杂性,这些属性或其他数据项中,对常量池的引用均未画出:
本文作者:zhangjg。

相关文档
最新文档