JAVA坎坷之路(9 day)

编程开发   © 文章版权由 admin 解释,禁止匿名转载

#楼主# 2022-6-28

/**
* 网络编程
* 网络通信协议
* TCP/IP协议(又称协议簇)
* 是一组用于实现网络协议的通信协议
* 其名称来源于该协议簇的两个重要协议(TCP和IP)
* 基于TCP/IP的参考模型将协议分为4个层次
* 链路层、网络层、传输层、应用层
* 链路层
* 也称为网络接口层 该层负责监视数据在主机和网络之间的交互
* 事实上 TCP/IP本身并未定义该层协议
* 而由参与互连的各网络使用自己的物理层和数据链路层协议与TCP/IP的网络层进行连接
* 网络层
* 也称网络互联层 是整个TCP/IP协议的核心
* 它主要用于将传输的数据进行分组 将分组数据发送到目标计算机或网络
* 传输层
* 主要完成网络程序的通信 在进行网络通信时 可以采用TCP
* 也可以采用UDP
* 应用层
* 主要负责应用程序的协议 如HTTP FTP等
* IP地址和端口号
* 想要使网络中的计算机能够通信 必须给计算机指定一个标识号(IP地址)
* IP地址泛用的版本是IPv4 它由4个字节大小的二进制表示
* 每一个字节用一个十进制数字表示(0-255) 数字间用 . 分开
* A类地址 1-127
* B类地址 128-191
* C类地址 192-223
* 通过IP地址可以访问计算机 如果想访问计算机中的某个应用程序 需要指定端口
* 端口号是用两个字节(16位的二进制)表示
* 它的取值范围0-65535
* 其中0-1023的端口号由操作系统的网络服务占用
* 用户的普通应用程序需要使用1024以上的端口
* 避免操作系统服务端口被其他服务占用
*/

/**
* JDBC
* jdbc的全程是java数据库连接 它是一套用于执行SQL语句的javaApi
* 应用程序可通过这套API连接到关系型数据库
* Driver接口是所有JDBC驱动程序必须实现的接口 该接口专门提供给数据库厂商使用
*/
// DriverManager接口用于加载JDBC驱动程序 创建与数据库的连接
// 用于向DriverManager注册给定的JDBC驱动程序
// DriverManager.registerDriver(Driver driver);
// 用于建立和数据库的连接 并返回表示连接的Connection对象
Connection connection = DriverManager.getConnection("url", "user", "pwd");
// Connection接口用于处理与特定数据库的连接
// 创建一个Statement对象将SQL语句发送到数据库
Statement statement = connection.createStatement();
// 创建一个PreparedStatement对象将参数化的SQL语句发送到数据库
PreparedStatement sql = connection.prepareStatement("select * from face.face_lamp");
// 创建一个CallableStatement对象来调用数据库存储过程
CallableStatement callableStatement = connection.prepareCall("insert into face_lamp(id, control_lamp, control_time, lamp_name) VALUES ()");
// Statement接口用于执行静态的SQL语句并返回一个结果对象
// 用于执行各种SQL语句 返回一个boolean类型的值 如果为true 表示所执行的SQL语句有查询结果
// 可以通过Statement的getResultSet方法获得查询结果
boolean execute = statement.execute("select *");
// 执行SQL中的insert update delete语句 返回一个int类型的值
// 表示数据库中受该SQL语句影响的记录条数
int insert_into_ = statement.executeUpdate("insert into face_lamp(id, control_lamp, control_time, lamp_name) values ()");
// 执行SQL中的select语句 返回一个表示查询结果的ResultSet对象
ResultSet resultSet = statement.getResultSet();
// PreparedStatement是Statement的子接口 用于执行预编译的SQL语句
// 在PreparedStatement对象中执行SQL语句 SQL语句必须是一个DML语句或者是无返回内容的SQL语句 如DDL语句
int i = sql.executeUpdate();
// 在PreparedStatement对象中执行SQL语句 返回的是ResultSet对象
ResultSet resultSet1 = sql.executeQuery();
// 将指定参数设置成给定的int值
// sql.setInt(10,2);
// 将指定参数设置成给定的String值
// sql.setString(0,"sd");
// ResultSet接口用于保存JDBC执行查询时返回的结果集 该结果集封装在一个逻辑表格中
// 用于获取指定字段的String类型的值 参数columnIndex代表字段的名称
String das = resultSet.getString
使用jdbc需要添加MySQL驱动jar包
// 加载并注册数据库驱动
// 在连接数据库之前 要加载数据库的驱动到JVM(java虚拟机)
Class.forName("com.mysql.cj.jdbc.Driver");
// 通过DriverManager获取数据库连接
String url="jdbc:mysql://localhost:3306/face?serverTimezone=UTC&useSSL=false";
String user="root";
String pwd="123456";

Connection connection = DriverManager.getConnection(url,user,pwd);

// 通过Connection对象获取Statement对象
Statement statement = connection.createStatement();
// 使用Statement执行SQL语句
ResultSet execute = statement.executeQuery("select * from face.face_lamp");
// 操作ResultSet结果集
while (execute.next())
{
int id = execute.getInt("id");
System.out.println(id);
}
// 关闭连接释放资源
execute.close();
statement.close();
connection.close();
/**
* java的反射机制是指在程序的运行状态中 可以构造任意一个类的对象
* 可以得到任意一个对象所属的类的信息
* 可以调用任意一个类的成员变量和方法
* 可以获取任意一个对象的属性和方法
* 这种动态获取程序信息和动态调用对象的功能称为java的反射机制
* 反射机制的优点是可以实现动态创建对象和编译
* Class类是JDK定义的类 他提供了很多方法 通过调用Class类的成员方法可以获取Class对象中的信息(.class文件中的信息)
*/
// class类的常用方法
// 传入完整的 包名.类名 名称实例化Class对象
Class name = Class.forName("com.sun.javafx.runtime.async.BackgroundExecutor");
// 得到一个类中的全部构造方法
Constructor[] constructors = name.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
// 得到本类中单独定义的全部属性
Field[] declaredFields = name.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
// 取得本类继承而来的全部属性
Field[] field = name.getFields();
for (Field field1 : field) {
System.out.println(field1);
}
// 得到一个类中的全部方法
Method[] methods = name.getMethods();
for (Method method : methods) {
System.out.println(method);
}
// 返回一个Method对象 并设置一个方法中的所有参数类型
Method method = name.getMethod("toString");
System.out.println(method);
// 得到一个类中所实现的全部接口
Class[] interfaces = name.getInterfaces();
for (Class anInterface : interfaces) {
System.out.println(anInterface);
}
// 得到一个类完整的 包名.类名 名称
String name1 = name.getName();
System.out.println(name1);
// 得到一个完整的包
Package aPackage = name.getPackage();
System.out.println(aPackage);
// 得到一个完整的父类
Class superclass = name.getSuperclass();
System.out.println(superclass);
// 根据Class定义的类实例化对象
// Object o = name.newInstance();
// System.out.println(o);
// 返回表示数组类型的Class
Class componentType = name.getCompo
历经磨难
似乎已经结束基础了
真的结束了吗?

还有[滑稽][滑稽][滑稽][滑稽]
/**
* java注解又称为java标注
* 是java5开始支持加入源代码的特殊语法元数据
* java语言中的类 方法 变量 参数和包灯都可以标注
* java标注可以通过反射获取标注的内容
* 在编译器生成class文件时 标注可以被嵌入到字节码中
* java虚拟机可以保留标注内容 在运行时可以获取到标注内容
*/
/**
* 注解是一种用于做标注的 元数据
* 可以理解为注解是一个标签
* 这个标签可以标记类 方法 变量 参数 包
* @Override注解标注在子类重写的方法 可检查方法是否正确的重写了父类的方法 如果错误则编译报错
*/
// @Deprecated 标记过时的方法 如果使用该方法 会报编译警告
// @SuppressWarnings() 指示编译器去忽略注解中声明的警告
// @SafeVarargs java7开始支持 忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告
// @FunctionalInterface java8开始支持 标记一个匿名函数或函数式接口
// 元注解
// @Retention() 标识这个注解怎么保存 是只在代码中 还是编入class文件中 或者是在运行时可以通过反射访问
// @Documented 标记这些注解是否包含在用户文档中
// @Target() 标记这个注解应该时那种java成员
// @Inherited 标记这个注解是继承于哪个注解类
// @Repeatable() java8开始支持 标识某个注解可以在同一个声明上使用多次
// java 分类 可以分三类
// 由编译器使用的注解
// 由工具处理.class文件使用的注解
// 在程序运行期间能够读取的注解、
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//自定义一个注解 注解通过@interface关键字来定义
//RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候 它会被加载进入到jvm中 所以程序运行时可以获取到它们
//RetentionPolicy.CLASS 注解只被保留到编译进行的时候 他并不会被加载到jvm中
//RetentionPolicy.SOURCE 注解只在源代码阶段保留 在编译器进行编译时它将会被丢弃忽略
@Retention(RetentionPolicy.RUNTIME) //定义我们自定义注解的生命周期
//ElementType.FIELD 可以给属性进行注解
//ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
//ElementType.CONSTRUCTOR 可以给构造方法进行注解
//ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
//ElementType.METHOD 可以给方法进行注解
//ElementType.PACKAGE 可以给一个包进行注解
//ElementType.PARAMETER 可以给一个方法内的参数进行注解
//ElementType.TYPE 可以给一个类型进行注解
//如果想要使用多个可以使用数组的方式
@Target({ElementType.FIELD,ElementType.METHOD})
public @interface Length {
// 定义三个参数 default设置参数的默认值
int min() default 0;
int max() default 10;
String message() default "长度不符合";
}
import org.omg.CORBA.Object;

import java.lang.reflect.Field;

public class Huluxia{
// 使用我们自定义的注解
@Length(min = 1,max = 2,message = "长度不能超过2-8")
private Integer a;
Huluxia(int a){
this.a=a;
}

public static void main(String[] args) throws Exception{
// 设置a的值为9 超出我们设置的范围
Huluxia huluxia = new Huluxia(100);
huluxia.check(huluxia);

}
public void check(Huluxia huluxia)throws Exception
{
Field[] declaredFields = huluxia.getClass().getDeclaredFields();
for (Field declaredField : declaredFields) {
// 获取注解
Length annotation = declaredField.getAnnotation(Length.class);
if(annotation!=null){
// 获取字段
String o = declaredField.get(huluxia).toString();
// instanceof 是 Java 的保留关键字,它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型
if(o instanceof String){

if(o.length() annotation.min())
{
throw new IllegalArgumentException(declaredField.getName()+":"+annotation.message());
}
}
}
}
}

public Integer getA() {
return a;
}

public void setA(Integer a) {
this.a = a;
}
}
程序运行的结果

今日修炼至练气十层
明日必定练气圆满[滑稽][滑稽][滑稽]
上面有个问题
就是我说a的长度那里 应该是100我写成9忘记改了
还有那个check方法才是注解生效的关键
1 2 3

评论

登录后才可发表内容
  • 主题

    23

  • 帖子

    325

  • 关注者

    0

Copyright © 2019 凯特网.   Powered by HYBBS 2.3.4  

Runtime:0.0517s Mem:2144Kb