摘要: Unix 系统已经长时间支持名为 readv 和 writev 的 2 个系统调用. 这些 read 和 write 的"矢量"版本使用一个结构数组, 每个包含一个缓存的指针和一个长度值. 一个 readv 调 用被期望来轮流读取指示的数量到每个缓存. 相反, writev 要收集每个缓存的内容到一 阅读全文
posted @ 2019-07-05 15:39 樊伟胜 阅读(2011) 评论(0) 推荐(0)
摘要: write, 象 read, 可以传送少于要求的数据, 根据返回值的下列规则: 如果值等于 count, 要求的字节数已被传送. 如果正值, 但是小于 count, 只有部分数据被传送. 程序最可能重试写入剩下的数 据. 如果值为 0, 什么没有写. 这个结果不是一个错误, 没有理由返回一个错误码. 阅读全文
posted @ 2019-07-05 15:38 樊伟胜 阅读(341) 评论(0) 推荐(0)
摘要: read 的返回值由调用的应用程序解释: 如果这个值等于传递给 read 系统调用的 count 参数, 请求的字节数已经被传送. 这是最好的情况. 如果是正数, 但是小于 count, 只有部分数据被传送. 这可能由于几个原因, 依赖 于设备. 常常, 应用程序重新试着读取. 例如, 如果你使用 阅读全文
posted @ 2019-07-05 15:37 樊伟胜 阅读(350) 评论(0) 推荐(0)
摘要: 读和写方法都进行类似的任务, 就是, 从和到应用程序代码拷贝数据. 因此, 它们的原型 相当相似, 可以同时介绍它们: ssize_t read(struct file *filp, char user *buff, size_t count, loff_t *offp); ssize_t writ 阅读全文
posted @ 2019-07-05 15:36 樊伟胜 阅读(253) 评论(0) 推荐(0)
摘要: 在介绍读写操作前, 我们最好看看如何以及为什么 scull 进行内存分配. "如何"是需要全 面理解代码, "为什么"演示了驱动编写者需要做的选择, 尽管 scull 明确地不是典型设备. 本节只处理 scull 中的内存分配策略, 不展示给你编写真正驱动需要的硬件管理技能. 其他风味的设备由不同的 阅读全文
posted @ 2019-07-05 15:35 樊伟胜 阅读(272) 评论(0) 推荐(0)
摘要: open 方法提供给驱动来做任何的初始化来准备后续的操作. 在大部分驱动中, open 应当 进行下面的工作: 检查设备特定的错误(例如设备没准备好, 或者类似的硬件错误 如果它第一次打开, 初始化设备 如果需要, 更新 f_op 指针. 分配并填充要放进 filp->private_data 的任 阅读全文
posted @ 2019-07-05 15:34 樊伟胜 阅读(341) 评论(0) 推荐(0)
摘要: 在内部, scull 使用一个 struct scull_dev 类型的结构表示每个设备. 这个结构定义为: struct scull_dev { struct scull_qset *data; /* Pointer to first quantum set */ int quantum; /* 阅读全文
posted @ 2019-07-05 15:33 樊伟胜 阅读(198) 评论(0) 推荐(0)
摘要: 如我们提过的, 内核在内部使用类型 struct cdev 的结构来代表字符设备. 在内核调用你 的设备操作前, 你编写分配并注册一个或几个这些结构. [11] 11为此, 你的代码应当包含 <linux/cdev.h>, 这个结构和它的关联帮助函数定义在这里. 有 2 种方法来分配和初始化一个这些 阅读全文
posted @ 2019-07-05 15:32 樊伟胜 阅读(522) 评论(0) 推荐(0)
摘要: inode 结构由内核在内部用来表示文件. 因此, 它和代表打开文件描述符的文件结构是不 同的. 可能有代表单个文件的多个打开描述符的许多文件结构, 但是它们都指向一个单个 inode 结构. inode 结构包含大量关于文件的信息. 作为一个通用的规则, 这个结构只有 2 个成员对于 编写驱动代码 阅读全文
posted @ 2019-07-05 15:31 樊伟胜 阅读(491) 评论(0) 推荐(0)
摘要: struct file, 定义于 <linux/fs.h>, 是设备驱动中第二个最重要的数据结构. 注意 file 与用户空间程序的 FILE 指针没有任何关系. 一个 FILE 定义在 C 库中, 从不出现在内核 代码中. 一个 struct file, 另一方面, 是一个内核结构, 从不出现在用 阅读全文
posted @ 2019-07-05 15:30 樊伟胜 阅读(837) 评论(0) 推荐(0)
摘要: 如同你想象的, 注册设备编号仅仅是驱动代码必须进行的诸多任务中的第一个. 我们将很 快看到其他重要的驱动组件, 但首先需要涉及一个别的. 大部分的基础性的驱动操作包括 3 个重要的内核数据结构, 称为 file_operations, file, 和 inode. 需要对这些结构的 基本了解才能够做 阅读全文
posted @ 2019-07-05 15:25 樊伟胜 阅读(973) 评论(0) 推荐(0)
摘要: 一些主设备编号是静态分派给最普通的设备的. 一个这些设备的列表在内核源码树的 Documentation/devices.txt 中. 分配给你的新驱动使用一个已经分配的静态编号的机会 很小, 但是, 并且新编号没在分配. 因此, 作为一个驱动编写者, 你有一个选择: 你可以 简单地捡一个看来没有用 阅读全文
posted @ 2019-07-05 15:23 樊伟胜 阅读(323) 评论(0) 推荐(0)
摘要: 在建立一个字符驱动时你的驱动需要做的第一件事是获取一个或多个设备编号来使用. 为 此目的的必要的函数是 register_chrdev_region, 在 <linux/fs.h>中声明: int register_chrdev_region(dev_t first, unsigned int co 阅读全文
posted @ 2019-07-05 15:11 樊伟胜 阅读(480) 评论(0) 推荐(0)
摘要: 在内核中, dev_t 类型(在 <linux/types.h>中定义)用来持有设备编号 -- 主次部分都包 括. 对于 2.6.0 内核, dev_t 是 32 位的量, 12 位用作主编号, 20 位用作次编号. 你的 代码应当, 当然, 对于设备编号的内部组织从不做任何假设; 相反, 应当利用 阅读全文
posted @ 2019-07-05 15:10 樊伟胜 阅读(650) 评论(0) 推荐(0)
摘要: 字符设备通过文件系统中的名子来存取. 那些名子称为文件系统的特殊文件, 或者设备文 件, 或者文件系统的简单结点; 惯例上它们位于 /dev 目录. 字符驱动的特殊文件由使用 ls -l 的输出的第一列的"c"标识. 块设备也出现在 /dev 中, 但是它们由"b"标识. 本章 集中在字符设备, 但 阅读全文
posted @ 2019-07-05 15:09 樊伟胜 阅读(369) 评论(0) 推荐(0)
摘要: 驱动需要知道的几个参数因不同的系统而不同. 从使用的设备号( 如我们在下一章见到的 ) 到驱动应当任何操作的几个方面. 例如, SCSI 适配器的驱动常常有选项控制标记命令队列 的使用, IDE 驱动允许用户控制 DMA 操作. 如果你的驱动控制老的硬件, 还需要被明确告 知哪里去找硬件的 I/O 阅读全文
posted @ 2019-07-05 15:06 樊伟胜 阅读(935) 评论(0) 推荐(0)
摘要: 编写驱动的第一步是定义驱动将要提供给用户程序的能力(机制).因为我们的"设备"是计算 机内存的一部分, 我们可自由做我们想做的事情. 它可以是一个顺序的或者随机存取的设 备, 一个或多个设备, 等等. 为使 scull 作为一个模板来编写真实设备的真实驱动, 我们将展示给你如何在计算机内存 上实现几 阅读全文
posted @ 2019-07-05 15:06 樊伟胜 阅读(530) 评论(0) 推荐(0)
摘要: 到目前, 我们的讨论已来到一个模块加载的重要方面: 竞争情况. 如果你在如何编写你的 初始化函数上不小心, 你可能造成威胁到整个系统的稳定的情形. 我们将在本书稍后讨论 竞争情况; 现在, 快速提几点就足够了: 首先时你应该一直记住, 内核的某些别的部分会在注册完成之后马上使用任何你注册的设 施. 阅读全文
posted @ 2019-07-05 15:05 樊伟胜 阅读(170) 评论(0) 推荐(0)
摘要: 每个非试验性的模块也要求有一个清理函数, 它注销接口, 在模块被去除之前返回所有资 源给系统. 这个函数定义为: static void exit cleanup_function(void) { /* Cleanup code here */ } module_exit(cleanup_funct 阅读全文
posted @ 2019-07-05 15:04 樊伟胜 阅读(332) 评论(0) 推荐(0)
摘要: 你必须记住一件事, 在注册内核设施时, 注册可能失败. 即便最简单的动作常常需要内存 分配, 分配的内存可能不可用. 因此模块代码必须一直检查返回值, 并且确认要求的操作 实际上已经成功. 如果在你注册工具时发生任何错误, 首先第一的事情是决定模块是否能够无论如何继续初 始化它自己. 常常, 在一个 阅读全文
posted @ 2019-07-05 15:04 樊伟胜 阅读(614) 评论(0) 推荐(0)
摘要: 如已提到的, 模块初始化函数注册模块提供的任何功能. 这些功能, 我们指的是新功能, 可以由应用程序存取的或者一整个驱动或者一个新软件抽象. 实际的初始化函数定义常常 如: static int init initialization_function(void) { /* Initializati 阅读全文
posted @ 2019-07-05 15:03 樊伟胜 阅读(200) 评论(0) 推荐(0)
摘要: 我们正在接近去看一些实际的模块代码. 但是首先, 我们需要看一些需要出现在你的模块 源码文件中的东西. 内核是一个独特的环境, 它将它的要求强加于要和它接口的代码上. 大部分内核代码包含了许多数量的头文件来获得函数, 数据结构和变量的定义. 我们将在 碰到它们时检查这些文件, 但是有几个文件对模块是 阅读全文
posted @ 2019-07-05 14:56 樊伟胜 阅读(142) 评论(0) 推荐(0)
摘要: 我们已经看到 insmod 如何对应共用的内核符号来解决未定义的符号. 表中包含了全局内 核项的地址 -- 函数和变量 -- 需要来完成模块化的驱动. 当加载一个模块, 如何由模块 输出的符号成为内核符号表的一部分. 通常情况下, 一个模块完成它自己的功能不需要输 出如何符号. 你需要输出符号, 但 阅读全文
posted @ 2019-07-05 14:55 樊伟胜 阅读(890) 评论(0) 推荐(0)
摘要: 记住, 你的模块代码一定要为每个它要连接的内核版本重新编译 -- 至少, 在缺乏 modversions 时, 这里不涉及因为它们更多的是给内核发布制作者, 而不是开发者. 模块 是紧密结合到一个特殊内核版本的数据结构和函数原型上的; 模块见到的接口可能一个内 核版本与另一个有很大差别. 当然, 在 阅读全文
posted @ 2019-07-05 14:54 樊伟胜 阅读(429) 评论(0) 推荐(0)
摘要: 每个电脑平台有其自己的特点, 内核设计者可以自由使用所有的特性来获得更好的性能. in the target object file ??? 不象应用程序开发者, 他们必须和预编译的库一起连接他们的代码, 依附在参数传递的规 定上, 内核开发者可以专用某些处理器寄存器给特别的用途, 他们确实这样做了 阅读全文
posted @ 2019-07-05 14:54 樊伟胜 阅读(251) 评论(0) 推荐(0)
摘要: 第一步, 我们需要看一下模块如何必须被建立. 模块的建立过程与用户空间的应用程序的 建立过程有显著不同; 内核是一个大的, 独立的程序, 对于它的各个部分如何组合在一起 有详细的明确的要求. 建立过程也与以前版本的内核的过程不同; 新的建立系统用起来更 简单并且产生更正确的结果, 但是它看起来与以前 阅读全文
posted @ 2019-07-05 14:53 樊伟胜 阅读(1992) 评论(0) 推荐(0)
摘要: 模块建立之后, 下一步是加载到内核. 如我们已指出的, insmod 为你完成这个工作. 这个 程序加载模块的代码段和数据段到内核, 接着, 执行一个类似 ld 的函数, 它连接模块中 任何未解决的符号连接到内核的符号表上. 但是不象连接器, 内核不修改模块的磁盘文件, 而是内存内的拷贝. insm 阅读全文
posted @ 2019-07-05 14:53 樊伟胜 阅读(6340) 评论(0) 推荐(0)
摘要: 1、需求 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生成各种类型的客户,生成各类型用户的概率比例为 阅读全文
posted @ 2019-07-05 13:53 樊伟胜 阅读(2239) 评论(0) 推荐(0)
摘要: 需求: 交通灯管理系统的项目需求 Ø 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 直行车辆 由西向而来去往南向的车辆 右转车辆 由东向而来去往南向的车辆 左转车辆 。。。 Ø 信号灯忽略黄灯,只考虑红灯和绿灯。 Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。 Ø 阅读全文
posted @ 2019-07-05 13:52 樊伟胜 阅读(239) 评论(0) 推荐(0)
摘要: 一、工厂类BeanFactory: 1、工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。 2、getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则返回该类 阅读全文
posted @ 2019-07-05 13:50 樊伟胜 阅读(303) 评论(0) 推荐(0)
摘要: 总结思考:让jvm创建动态类及其实例对象,需要给它提供哪些信息? 三个方面: 1、生成的类中有哪些方法,通过让其实现哪些接口的方式进行告知; 2、产生的类字节码必须有个一个关联的类加载器对象; 3、生成的类中的方法的代码是怎样的,也得由我们提供。把我们的代码写在一个约定好了接口对象的方法中,把对象传 阅读全文
posted @ 2019-07-05 13:49 樊伟胜 阅读(306) 评论(0) 推荐(0)
摘要: package javaenhance.src.cn.itcast.day3; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Met 阅读全文
posted @ 2019-07-05 13:49 樊伟胜 阅读(220) 评论(0) 推荐(0)
摘要: 1、要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情!写成百上千个代理类,是不是太累! 2、JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。 3、JVM生成的动态类必须实现一个或多个接口,所以,JVM生成 阅读全文
posted @ 2019-07-05 13:48 樊伟胜 阅读(323) 评论(0) 推荐(0)
摘要: 1、引入: 为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、事务管理、等等,你准备如何做? 编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。 2、代理类的优点: 如果采用工厂模式和配 阅读全文
posted @ 2019-07-05 13:47 樊伟胜 阅读(639) 评论(0) 推荐(0)
摘要: 编写一个能打印出自己的类加载器名称和当前类加载器的父子结构关系链的MyServlet,正常发布后,看到打印结果为WebAppClassloader。 把MyServlet.class文件打jar包,放到ext目录中,重启tomcat,发现找不到HttpServlet的错误。 把servlet.jar 阅读全文
posted @ 2019-07-05 13:46 樊伟胜 阅读(132) 评论(0) 推荐(0)
摘要: l 当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢? 1.首先当前线程的类加载器去加载线程中的第一个类。 2.如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。 3.还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。 阅读全文
posted @ 2019-07-05 13:45 樊伟胜 阅读(470) 评论(0) 推荐(0)
摘要: 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记。 以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。 标记可以加在包,类,字段,方法,方法的参数以及局部变量上。 一个注解相当于一个类。 阅读全文
posted @ 2019-07-05 13:44 樊伟胜 阅读(635) 评论(0) 推荐(0)
摘要: Jdk 1.5以前的集合类中存在什么问题 ArrayList collection = new ArrayList(); collection.add(1); collection.add(1L); collection.add("abc"); int i = (Integer) collectio 阅读全文
posted @ 2019-07-05 13:44 樊伟胜 阅读(96) 评论(0) 推荐(0)
摘要: 1、定义:简单说,类加载器就是加载类的工具。 当出现一个类,用到此类的时候,Java虚拟机首先将类字节码加载进内存,通常字节码的原始信息放在硬盘上的classpath指定的目录下。 2、类加载器作用:将.class文件中的内容加载进内存进行处理,处理完后的结果就是字节码。 3、默认类加载器: 1)J 阅读全文
posted @ 2019-07-05 13:44 樊伟胜 阅读(109) 评论(0) 推荐(0)
摘要: 演示用eclipse自动生成 ReflectPoint类的setter和getter方法。 直接new一个PropertyDescriptor对象的方式来让大家了解JavaBean API的价值,先用一段代码读取JavaBean的属性,然后再用一段代码设置JavaBean的属性。 演示用eclips 阅读全文
posted @ 2019-07-05 13:42 樊伟胜 阅读(214) 评论(0) 推荐(0)
摘要: JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。 如果要在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称之为值对象(Value Object,简称VO)。 阅读全文
posted @ 2019-07-05 13:14 樊伟胜 阅读(156) 评论(0) 推荐(0)
摘要: 框架与框架要解决的核心问题 我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。 框架要解决的核心问题 我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢 阅读全文
posted @ 2019-07-05 13:04 樊伟胜 阅读(546) 评论(0) 推荐(0)
摘要: 用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。 1、私有的构造方法。 2、每个元素分别用一个公有的静态成员变量表示。 可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类 Eg:package july78javaEnh 阅读全文
posted @ 2019-07-05 13:03 樊伟胜 阅读(596) 评论(0) 推荐(0)
摘要: ——> -128~127之间的特殊性。为什么要这样设计,好处? ——> 享元模式(Flyweight Pattern):享元模式的特点是,复用我们内存中已存在的对象,降低系统创建对象实例。 自动装箱: Integer num1 = 12; 自动拆箱: System.out.println(num1 阅读全文
posted @ 2019-07-05 12:51 樊伟胜 阅读(210) 评论(0) 推荐(0)
摘要: 语法: for ( type 变量名:集合变量名 ) { … } 注意事项: 迭代变量必须在( )中定义! 集合变量可以是数组或实现了Iterable接口的集合类 举例: public static int add(int x,int ...args) { int sum = x; for(int 阅读全文
posted @ 2019-07-05 12:50 樊伟胜 阅读(209) 评论(0) 推荐(0)
摘要: 是为了解决一个简单的方法在参数不同时多个重载的问题,用带可变参数的一个函数就能解决。 可变参数的特点: 1)只能出现在参数列表的最后; 2) ... 位于变量类型和变量名之间,前后有无空格都可以; 3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组 的形式访问可变参数。 阅读全文
posted @ 2019-07-05 12:43 樊伟胜 阅读(307) 评论(0) 推荐(0)
摘要: import语句可以导入一个类或某个包中的所有类 import static语句导入一个类中的某个静态方法或所有静态方法 语法举例: import static java.lang.Math.sin; import static java.lang.Math.*; 例子: 原来的: package 阅读全文
posted @ 2019-07-05 12:40 樊伟胜 阅读(324) 评论(0) 推荐(0)
摘要: eclipse与myeclipse的关系(都属于java开发的工具): 后者是前者的一个插件,后来为了方便使用,myeclipse集合了eclipse,后者是收费的。 可大部分人都是用 eclipse 等常用的免费软件。最好用的因为别人都在用。这就是市场。 eclipse是java的一种IDE开发工 阅读全文
posted @ 2019-07-05 12:33 樊伟胜 阅读(310) 评论(0) 推荐(0)
摘要: 继承体系 MenuBar,Menu,MenuItem之间的关系: 先创建菜单条,再创建菜单,每一个菜单中建立菜单项。 也可以菜单添加到菜单中,作为子菜单。 通过setMenuBar()方法,将菜单添加到Frame中。 package june610; import java.awt.FileDial 阅读全文
posted @ 2019-07-05 12:31 樊伟胜 阅读(986) 评论(0) 推荐(0)
摘要: Dialog构造方法 * Dialog(Frame owner, String title, boolean modal) 构造一个最初不可见的 Dialog,它带有指定的所有者 Frame、标题和模式。 备注:Dialog的模式区别在于: true的话对话框依附于窗体,不取消Dialog不可以操作 阅读全文
posted @ 2019-07-05 12:29 樊伟胜 阅读(2934) 评论(0) 推荐(0)
摘要: 事件源(组件) 事件(Event) 监听器(Listener) 事件处理(引发事件后处理方式) 事件监听机制流程图 务必记牢: 确定事件源(容器或组件) 通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。 该方法中接收XXXListener的子类对象,或者XXXListe 阅读全文
posted @ 2019-07-05 12:28 樊伟胜 阅读(491) 评论(0) 推荐(0)
摘要: 容器中的组件的排放方式,就是布局。 常见的布局管理器: FlowLayout(流式布局管理器)//目前最常用的 从左到右的顺序排列。 Panel默认的布局管理器。 BorderLayout(边界布局管理器) 东,南,西,北,中 Frame默认的布局管理器。 GridLayout(网格布局管理器) 规 阅读全文
posted @ 2019-07-05 12:27 樊伟胜 阅读(860) 评论(0) 推荐(0)
摘要: GUI Graphical User Interface(图形用户接口)。 用图形的方式,来显示计算机操作的界面,这样更方便更直观。 CLI Command line User Interface (命令行用户接口) 就是常见的Dos命令行操作。 需要记忆一些常用的命令,操作不直观。 举例: 比如: 阅读全文
posted @ 2019-07-05 12:26 樊伟胜 阅读(660) 评论(0) 推荐(0)
摘要: 通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public。获得Field对象后都可以使用getType()来获取其类型。 Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该F 阅读全文
posted @ 2019-07-05 10:38 樊伟胜 阅读(6548) 评论(0) 推荐(0)
摘要: Field提供两组方法操作字段: xxx getXxx(Object obj):获取obj对象该Field的字段值,此处的xxx表示8个基本数据类型。若该字段的类型是引用数据类型则使用,Object get(Object obj); void setXxx(Object obj,xxx val):将 阅读全文
posted @ 2019-07-05 10:34 樊伟胜 阅读(2557) 评论(0) 推荐(0)
摘要: 使用反射操作对象-调用可变参数方法 要把可变参数都当做是其对应的数组类型参数; 如 show(XX... is)作为show(XX[] is)调用; 若可变参数元素类型是引用类型: JDK内部接收到参数之后,会自动拆包取出参数再分配给该底层方法,为此我们需要把这个数组实参先包装成一个Object对象 阅读全文
posted @ 2019-07-05 10:33 樊伟胜 阅读(4565) 评论(0) 推荐(0)
摘要: 每个Method的对象对应一个具体的底层方法。获得Method对象后,程序可以使用Method里面的invoke方法来执行该底层方法。 Object invoke(Object obj,Object ... args):obj表示调用底层方法的对象,后面的args表示传递的实际参数。 如果底层方法是 阅读全文
posted @ 2019-07-05 10:32 樊伟胜 阅读(894) 评论(0) 推荐(0)
摘要: 创建对象: 1、使用Class对象的newInstance()方法创建该Class对象的实例,此时该Class对象必须要有无参数的构造方法。 2、使用Class对象获取指定的Constructor对象,再调用Constructor的newInstance()方法创建对象类的实例,此时可以选择使用某个 阅读全文
posted @ 2019-07-05 10:31 樊伟胜 阅读(22245) 评论(0) 推荐(0)
摘要: 常用方法: Constructor类用于描述类中的构造方法: Constructor<T> getConstructor(Class<?>... parameterTypes) 返回该Class对象表示类的指定的public构造方法; Constructor<?>[] getConstructors 阅读全文
posted @ 2019-07-05 10:24 樊伟胜 阅读(1391) 评论(0) 推荐(0)
摘要: 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void通过class属性也表示为 Class 对象; Class类中boolean isPrimitive() :判定指定的 Class 对象是否表示一个基本类型。 包 阅读全文
posted @ 2019-07-05 10:22 樊伟胜 阅读(400) 评论(0) 推荐(0)
摘要: package junereflect624; import java.lang.reflect.Modifier; class A { } interface B{ } interface C{ } public class BaseDemo3 extends A implements B,C{ 阅读全文
posted @ 2019-07-05 10:22 樊伟胜 阅读(890) 评论(0) 推荐(0)
摘要: 如何得到各个字节码对应的实例对象? 每个类被加载后,系统会为该类生成对应的Class对象,通过Class对象可以访问到JVM中的这个类, 3种方式: 1、调用某个类的class属性获取Class对象,如Date.class会返回Date类对应的Class对象(其实就是得到一个类的一份字节码文件); 阅读全文
posted @ 2019-07-05 10:19 樊伟胜 阅读(224) 评论(0) 推荐(0)
摘要: 反射的引入: Object obj = new Student(); 若程序运行时接收到外部传入的一个对象,该对象的编译类型是Object,但程序又需要调用该对象运行类型的方法: 1.若编译和运行类型都知道,使用 instanceof判断后,强转。 2.编译时根本无法预知该对象属于什么类,程序只能依 阅读全文
posted @ 2019-07-05 10:17 樊伟胜 阅读(1262) 评论(0) 推荐(0)
摘要: 从客户端上传到服务器端,其实本质上也就是复制! package july76net; //上传文件(文本) import java.io.BufferedReader; import java.io.FileReader; import java.io.InputStreamReader; impo 阅读全文
posted @ 2019-07-05 10:16 樊伟胜 阅读(785) 评论(0) 推荐(0)
摘要: 两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。 tcp的两个端点:一个是客户端,一个是服务端。 客户端:对应的对象,Socket 服务端:对应的对象,ServerSocket TCP客户端: ①:建立tcp的so 阅读全文
posted @ 2019-07-05 10:15 樊伟胜 阅读(1538) 评论(0) 推荐(0)
摘要: ①:只要是网络传输,必须有socket 。 ②:数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。 直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。 因为数据包中包含的信 阅读全文
posted @ 2019-07-05 10:13 樊伟胜 阅读(1364) 评论(0) 推荐(0)
摘要: InetAddress:构造方法私有,不能直接创建对象。 InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址。 InetAddress getLocalHost():返回本地主机。 InetAddress[] getAllByName(Str 阅读全文
posted @ 2019-07-05 10:12 樊伟胜 阅读(309) 评论(0) 推荐(0)
摘要: IP地址 端口号 传输协议 IP地址:InetAddress 网络中设备的标识 不易记忆,可用主机名 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址,不同进程的标识 有效端口:0~65535,其中0~1024系统使用或保留端口。 备注:不是所谓的物理端口 阅读全文
posted @ 2019-07-05 10:06 樊伟胜 阅读(132) 评论(0) 推荐(0)
摘要: 一.区别 二者都是有用的和常用的,如果纯粹从概念上区分二者就比较费解了,我们直接从功能上进行区分,简单明了: 这两种传输协议也就是合于适配不同的业务和不同的硬件终端。 在使用中,类似于图像、声音等对可靠性要求没有那么高的业务可以用UDP,他们不需要准确存储对准确性无要求但要求速度快。 类似于文本、程 阅读全文
posted @ 2019-07-05 10:06 樊伟胜 阅读(2138) 评论(0) 推荐(0)
摘要: 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。在网络 阅读全文
posted @ 2019-07-05 09:15 樊伟胜 阅读(1387) 评论(0) 推荐(0)
摘要: 需要两个源文件,还有输出的目标文件 SequenceInputStream: 将两个文件的内容合并成一个文件 该类提供的方法: SequenceInputStream(InputStream s1, InputStream s2) :根据两个字节输入流对象来创建合并流对象。 备注:谁放在前面,谁就先 阅读全文
posted @ 2019-07-05 09:10 樊伟胜 阅读(833) 评论(0) 推荐(0)
摘要: 缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写效率,同时增加了一些新的方法。 四种缓冲流 BufferedReader(Reader in) BufferedReader(Reader in,int sz)//sz表示自定义缓冲区大小 BufferedWriter(Wr 阅读全文
posted @ 2019-07-05 09:03 樊伟胜 阅读(182) 评论(0) 推荐(0)
摘要: Scanner(File source) 构造一个新的 Scanner,它生成的值是从指定文件扫描的。 备注:实现了Iterable接口 package june6D; import java.io.File; import java.io.PrintStream; import java.util 阅读全文
posted @ 2019-07-05 09:02 樊伟胜 阅读(903) 评论(0) 推荐(0)
摘要: 标准输入流: System.in 默认表示的是键盘录入 标准输出流: System.out 默认表示的是屏幕输出 Eg: package june6D; import java.io.FileInputStream; import java.io.IOException; import java.i 阅读全文
posted @ 2019-07-05 09:01 樊伟胜 阅读(593) 评论(0) 推荐(0)
摘要: Java5后,PrintStream类多了printf()方法用于格式化输出操作。但是格式化输出的时候必须指定输出数据的类型: (构造方法) PrintStream format(String fo, Object... args) 使用指定格式字符串和参数将格式化字符串写入此输出流中。 备注:当然 阅读全文
posted @ 2019-07-05 09:00 樊伟胜 阅读(739) 评论(0) 推荐(0)
摘要: (只有两个,PrintWriter和PrintStream) 思考:如果现在要想完成一个字符串或者是boolean型或者是字符型的数据输出使用OutputStream是否方便? 肯定是不方便的,因为OutputStream中只能操作字节数据,所以其他的数据类型很难操作,那么在Java的IO包中为了解 阅读全文
posted @ 2019-07-05 08:58 樊伟胜 阅读(214) 评论(0) 推荐(0)
摘要: 操作内存流的时候(从读取出来,注意一定要把真正的数据用toByteArray或者toCharArray将数据读出来) 之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流。此时要使用内存流完成内存的输入和输出操作。 如果程序运行过程中要产生一些临时文件,可采用虚拟文 阅读全文
posted @ 2019-07-05 08:57 樊伟胜 阅读(1293) 评论(0) 推荐(0)
摘要: Java 7简化资源清理(try-with-resources)自动关闭资源的try语句 自动关闭资源格式: try( )//此处多了圆括号,()圆括号内写打开资源的代码,在这里创建的对象必须实现Autocloseable接口 { IO操作 } catch(){ 处理异常的代码 } Eg:packa 阅读全文
posted @ 2019-07-05 08:56 樊伟胜 阅读(1576) 评论(0) 推荐(0)
摘要: 需求:源和目标! 那么我们需要源文件和目标文件! 构建管道的时候就需要两个:输出流和输入流管道! Eg: package july7file; //java7开始的自动关闭资源 import java.io.File; import java.io.FileInputStream; import j 阅读全文
posted @ 2019-07-05 08:55 樊伟胜 阅读(378) 评论(0) 推荐(0)
摘要: OutputStreamWriter:把字节输出流对象转成字符输出流对象 InputStreamReader:把字节输入流对象转成字符输入流对象 FileWriter和FileReader分别是OutputStreamWriter和InputStreamReader的直接子类,而不是Writer和R 阅读全文
posted @ 2019-07-05 08:55 樊伟胜 阅读(545) 评论(0) 推荐(0)
摘要: 二者仅仅是操作单位不一样。 InputStream和Reader是所有输入流的基类,他们都是抽象类,本身不能创建实例,但是他们是所有输入流的模板。 一般来说处理字符或字符串时使用字符流,处理字节或二进制对象时应使用字节流; 备注:字符流必须关闭资源,因为它中间有缓冲区!而字节流不需要!但是一般都会( 阅读全文
posted @ 2019-07-05 08:54 樊伟胜 阅读(256) 评论(0) 推荐(0)
摘要: File类本身是与文件操作有关,但是如果要想操作内容则必须使用字节流或字符流完成,但是不管是使用何种的输入输出流,其基本的操作原理是一样的(以文件流为准): 一、使用File类找到一个文件对象,得到IO操作的源或目标 二、通过字节流或字符流的子类创建对象,(得到IO操作的通道) 三、进行读或写的操作 阅读全文
posted @ 2019-07-05 08:53 樊伟胜 阅读(572) 评论(0) 推荐(0)
摘要: 数据流是一串连续不断的数据的集合,就像水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流. 数据写入程序可以使一段一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流. 在程序中所有的数据都是以流的方法进行传输和保存的。 Java 的IO是实现输入 阅读全文
posted @ 2019-07-05 08:52 樊伟胜 阅读(162) 评论(0) 推荐(0)
摘要: File 类里有方法: String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 FilenameFilter(文件过滤器)该接口里包含accept(File dir,String name)方法 阅读全文
posted @ 2019-07-05 08:51 樊伟胜 阅读(281) 评论(0) 推荐(0)
摘要: 现在要求输出一个给定目录中的全部文件的路径。 本程序肯定只能依靠递归的操作完成,因为在一个给定的路径下有可能还是文件夹,那么如果是文件夹的话则肯定要继续列出,重复判断。 递归:程序调用自身的编程技巧 递归就是在方法里调用自身; 在使用递归时,必须有一个明确的递归结束条件,称为递归出口。 练习:列出文 阅读全文
posted @ 2019-07-05 08:50 樊伟胜 阅读(539) 评论(0) 推荐(0)
摘要: IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 File类在整个IO包中与文件本身有关的操作类,所有的与文件本身有关指的是创建、删除文件等操作。在java.io包中的File类本身是一个跨平台的文件操作类,所以在操作中要更多的考虑到各个操作 阅读全文
posted @ 2019-07-05 08:49 樊伟胜 阅读(320) 评论(0) 推荐(0)
摘要: package july7; //泛型加Map的输出! import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMa 阅读全文
posted @ 2019-07-05 08:48 樊伟胜 阅读(1723) 评论(0) 推荐(0)
摘要: java5后,可以声明泛型接口,声明方式和声明泛型类是一样的。 public interface IDAO<T>{} 泛型接口子类有两种方式: 直接在子类后申明泛型; 在子类实现的接口中给出具体的泛型类型 public class DaoImpl<T> implements IDAO<T>{} pu 阅读全文
posted @ 2019-07-05 08:47 樊伟胜 阅读(1614) 评论(0) 推荐(0)
摘要: 设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类: 声明对象:类名<? extends 类> 对象名 定义类:类名<泛型标签 extends 类>{} 设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类: 声明对象:类名<? super 类> 对象名 阅读全文
posted @ 2019-07-05 08:45 樊伟胜 阅读(4796) 评论(0) 推荐(2)
摘要: 若一个类中多个字段需要不同的泛型声明,则在声明类的时候指定多个泛型类型即可; 格式: public interface IDAO<PK, T> { PK add(T t); void remove(PK id); void update(PK id, T t); T get(PK id); } 在进 阅读全文
posted @ 2019-07-05 08:44 樊伟胜 阅读(4536) 评论(0) 推荐(0)
摘要: 泛型类 在类声明时通过一个标识符表示类中某个字段的类型或者某个方法的返回值或参数的类型,这样在类声明或实例化的时候只要指定自己需要的类型就ok。 声明带泛型的类: class 类名<泛型类型1,泛型类型2……>{ 泛型类型 变量名; 泛型类型 方法名(){} 返回值类型 方法名(泛型类型 变量名){ 阅读全文
posted @ 2019-07-05 08:43 樊伟胜 阅读(234) 评论(0) 推荐(0)
摘要: 引入:我想使用List集合装公司的员工,却装了一条狗进来; 使用TreeSet的时候,只能存放同一种数据类型,可惜存了不同的数据类型,依然没有报错,可是运行时出错. 泛型定义: java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型 阅读全文
posted @ 2019-07-05 08:36 樊伟胜 阅读(328) 评论(0) 推荐(0)
摘要: public static List asList(Object... a)返回一个受指定数组支持的固定大小的列表(返回的是不可变的List(长度固定))。 (对返回列表的更改会“直接写”到数组。)此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 colle 阅读全文
posted @ 2019-07-05 08:35 樊伟胜 阅读(176) 评论(0) 推荐(0)
摘要: Vector:线程安全,但速度慢,已被ArrayList替代。 ArrayList:线程不安全,查询速度快。 LinkedList:链表结构,增删速度快。取出List集合中元素的方式: get(int index):通过脚标获取元素。 iterator():通过迭代方法获取迭代器对象。 ArrayL 阅读全文
posted @ 2019-07-05 08:34 樊伟胜 阅读(399) 评论(0) 推荐(0)
摘要: 映射关系,也有人称为字典,Map集合里存在两组值,一组是key,一组是value。Map里的key不允许重复。通过key总能找到唯一的value与之对应。 Map里的key集存储方式和对应的Set集合中的元素存储方式一致; 学生都有一个学号,我们能点学号就能找到某个学生,好比这个学号就是key,学生 阅读全文
posted @ 2019-07-05 08:34 樊伟胜 阅读(146) 评论(0) 推荐(0)
摘要: 操作集合的工具类: static void reverse(List list):反转指定List集合中的顺序;(和ListItertor的逆序排列一样!) static void shuffle(List list):对集合元素随机排序 static void sort(List list):自然 阅读全文
posted @ 2019-07-05 08:34 樊伟胜 阅读(165) 评论(0) 推荐(0)
摘要: Collection子接口; List是有序的集合,集合中每个元素都有对应的顺序序列。List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元素的添加顺序设置元素的索引,比如第一个元素的索引就是0,好似数组。 List作为Collection子接口当 阅读全文
posted @ 2019-07-05 08:33 樊伟胜 阅读(163) 评论(0) 推荐(0)
摘要: TreeSet会调用元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Compareble接口,并覆写其int compareTo(Object o)方法; 该方法用于比较对象,若:obj1,compareTo(obj 阅读全文
posted @ 2019-07-05 08:31 樊伟胜 阅读(3117) 评论(0) 推荐(0)
摘要: TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2)方法,用于比较两个对象的大小,比较结果和compareTo方法一致; 要实现定制排序,需要在创建T 阅读全文
posted @ 2019-07-05 08:31 樊伟胜 阅读(678) 评论(0) 推荐(0)
摘要: TreeSet是SortedSet接口唯一的实现,与HashSet相比额外的方法有: Comparator comparator():返回当前Set使用的Comparator,若返回null,表示以自然顺序排序。 Object first() 返回此 set 中当前第一个(最低)元素。 Object 阅读全文
posted @ 2019-07-05 08:29 樊伟胜 阅读(233) 评论(0) 推荐(0)