java08八、类加载反射

1 网络编程

1.1 网络编程三要素

设备标识号:即Ip地址

应用程序的标识:即端口号

网络通信协议:对数据的传输格式、传输速率、传输步骤等做了统一规定 。常用的UDP协议、TCP协议。

1.2 Ip地址

网络中设备的唯一标识。分为两大类:IPV4IPV6.

Ipv4:给每个连接网络的主机分配了一个32bit的地址,即4个字节,为了方便使用,Ipv4地址经常写成十进制形式,例192.168.1.11

Ipv6:由于互联网的发展,IP地址需求量大,为了扩大地址空间,采用128位地址,每16个字节一组,分成8组十六进制数。

特殊IP地址:

127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用

常用命令:

ipconfig 查看本机ip

ping ip:检查网络

InetAddress

//通过主机名或者主机ip获取到InetAddress

InetAddress address = InetAddress.getByName("itheima");      

 InetAddress address = InetAddress.getByName("192.168.1.66");

String name=address.getHostName();//获取IP地址主机名

String  ip=address.getHostAddress();//获得IP地址字符串

1.3 端口号

设备上应用程序的唯一标识。

端口号:用两个字节表示的整数,取值范围0-65535,其中0-1023之间的端口号用于一些知名的网络服务和应用。一般程序使用1024以上的。

1.4协议

1UDP:无连接的通信协议

  发送端不会确认接收端是否存在,就会发送协议。接收端也不会反馈是否收到数据,不能保证数据的完整性。

2TCP:有连接的通信协议

提供了两台计算机之间可靠无差错的数据传输。三次握手,保证数据安全。例如上传、下载文件、浏览网页

 

2 类加载

1)类加载的描述:

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化

2)类的加载:

就是指将class文件读入内存,并为之创建一个 java.lang.Class 对象

任何类被使用时,系统都会为之建立一个 java.lang.Class 对象

(3)类的连接

验证阶段:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致准备阶段:负责为类的类变量分配内存,并设置默认初始化值

解析阶段:将类的二进制数据中的符号引用替换为直接引用

(4)类的初始化步骤:

假如类还未被加载和连接,则程序先加载并连接该类;

假如该类的直接父类还未被初始化,则先初始化其直接父类;

假如类中有初始化语句,则系统依次执行这些初始化语句;

注意:在执行第2个步骤的时候,系统对直接父类的初始化步骤也遵循初始化步骤1-3

(5)类的初始化时机

创建类的实例;

调用类的类方法(即static方法);

访问类或者接口的类变量,或者为该类变量赋值;

使用反射方式来强制创建某个类或接口对应的java.lang.Class;

对象初始化某个类的子类;

直接使用java.exe命令来运行某个主类。

 

2.2类加载器

2.2.1类加载器的作用

负责将.class文件加载到内存中,并为之生成对应的 java.lang.Class 对象。

2.2.2 JVM的类加载机制

全盘负责:就是当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入

父类委托:就是当一个类加载器负责加载某个Class时,先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类

缓存机制:保证所有加载过的Class都会被缓存,当程序需要使用某个Class对象时,类加载器先从缓存区中搜索该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存储到缓存区

2.2.3 Java中的内置类加载器

Bootstrap class loader它是虚拟机的内置类加载器,通常表示为null ,并且没有父null

Platform class loader平台类加载器可以看到所有平台类 ,平台类包括由平台类加载器或其祖先定义的JavaSE平台API,其实现类和JDK特定的运行时类

System class loader:它也被称为应用程序类加载器 ,与平台类加载器不同。 系统类加载器通常用于定义应用程序类路径,模块路径和JDK特定工具上的类类加载器的继承关系:System的父加载器为Platform,而Platform的父加载器为Bootstrap

2.2.4 ClassLoader 中的两个方法

方法名说明

static ClassLoader getSystemClassLoader()返回用于委派的系统类加载器

ClassLoader getParent()返回父类加载器进行委派方法分类

示例代码

public class ClassLoaderDemo {    

public static void main(String[] args) {        

// ClassLoader getSystemClassLoader()返回用于委派的系统类加载器        

ClassLoader c = ClassLoader.getSystemClassLoader();      

  System.out.println(c); //AppClassLoader 

       //ClassLoader getParent():返回父类加载器进行委派      

    ClassLoader c2 = c.getParent();        

System.out.println(c2); //PlatformClassLoader     

ClassLoader c3 = c2.getParent();    

   System.out.println(c3); //null

}}

 

3 反射

3.1 反射的概述

 是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。

3.2 三种方式获取class对象

(1)使用类的class属性来获取该类对应的class对象

Class<Student> c1=Student.class;

System…..(c1);--------àcom.test.Student

 

(2) 调用对象的getClass方法

      //调用对象的getClass()方法,返回该对象所属类对应的Class对象        

Student s = new Student();      

     Class<? extends Student> c2 = s.getClass();

(3)使用Class类中的静态方法 forName(String classname)

     Class<?> c3 = Class.forName("com.test.Student");

      //3.21 获取Student的公共构造方法

Constructor<?>[ ] cons=c3.getConstructors();

//获取Student的无参构造方法

Constructor<?> con=c3.getConstructor();

//通过反射获取Student等同于 Student s=newStudent();

Object obj=con.newInstance();

 

//3.2.2 获取成员变量

Field[] fields=c.getField();//获取公共成员方法

Field field=c.getField(name:“age”);//获取公共成员方法

field.set(obj,23);//给obj的变量age赋值23

//3.2.3 获取方法

Method[] methods=c.getMethods();

 

posted @ 2021-12-16 09:30  烁妈妈  阅读(38)  评论(0)    收藏  举报