学习Java第二十六天

一、元注解

@Target 主要用于来表示作用的位置

a、TYPE 在类中使用注解

b、FIELD 在属性上使用

c、METHOD 在方法上使用注解

@Retention 主要用于注解是否被识别

RUNTIME 注解在运行期间被jvm来识别

@Inherited 用于表示注解是否被子类继承使用

@Documented 用于标注是否在api文档上显示这个注解

二、案例

step01需求 使用注解 动态调用一个类中的方法

step02分析

A、调用一个类的方法(反射使用配置文件存储)

a、完整包名+类名 b、方法的名称

B、注解:

元注解:

a、运行阶段识别 b、在类上使用

属性:

a、定义一个注解类 b、注解类中定义两个睡醒:

C、定义一个测试类 使用注解 给属性赋值

D、通过反射动态调用类中的方法

step03代码-学生类

package com.gdk.test01; public class Student { public void showInfo(){ System.out.println("今天周一,开开心心过一天"); } }

step03代码-注解类

package com.gdk.test01; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnno { //定义两个属性 //获取完整的包名和类名 String className(); //获取方法名称 String methodName(); }

step05代码-测试类

package com.gdk.test01; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @MyAnno(className = "com.gdk.test01.Student",methodName = "showInfo") public class Test01 { public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException, ClassNotFoundException { //通过反射来获取对象 Class t = Test01.class; //有本对象获取注解对象 MyAnno myAnno = (MyAnno) t.getAnnotation(MyAnno.class); //调用方法来获取注解中的属性 String className = myAnno.className(); String methodName = myAnno.methodName(); //获取Class对象 Class<?> cla = Class.forName(className); //获取构造方法 Constructor<?> con = cla.getConstructor(); //实例化对象 Object o = con.newInstance(); //获取方法 Method me = cla.getMethod(methodName); //调用方法 me.invoke(o); } }

三、案例

step01 需求做一个自动化的工具 检查一个类中方法是否有bug 如果有bug将bug收集写入到文件

step02-代码-定义一个注解类

package com.gdk.test02; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnno { }

step03-代码-工具类

package com.gdk.test02; public class PayUtils { @MyAnno public void showInfo01(){ System.out.println(1+0); } @MyAnno public void showInfo02(){ // System.out.println(1*0); String str=null; System.out.println(str.length()); } @MyAnno public void showInfo03(){ System.out.println(1-0); } @MyAnno public void showInfo04(){ System.out.println(1/0); } @MyAnno public void showInfo0(){ System.out.println("嘿嘿嘿"); } }

step04-代码-测试类

package com.gdk.test02; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Test01 { public static void main(String[] args) throws IOException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { // //通过反射获取对象 // Class cla = Class.forName("com.gdk.test02.PayUtils"); // //获取构造方法 // Constructor con = cla.getConstructor(); // //实例化对象 // Object o = con.newInstance(); PayUtils p = new PayUtils(); Class cla = p.getClass(); //获取所有方法 Method[] methods = cla.getMethods(); //因为需要使用到字符流所以要把里面定义的字符流提到外面来定义 BufferedWriter bw=null; //定义一个变量 Integer count=0; //使用循环遍历 for (Method m:methods){ //判断方法上是否有注解 if (m.isAnnotationPresent(MyAnno.class)){ //调用方法 try { m.invoke(p); } catch (Exception e) { //使用高效字符流把错误写进文档 bw=new BufferedWriter(new FileWriter("2.txt",true)); bw.write(m.getName()+"产生异常是:"+e.getCause().getMessage()); bw.newLine(); bw.flush(); count++; } } } bw.newLine(); bw.write("一共出现了"+count+"次异常"); //关闭资源 bw.close(); } }

四、网络编程

4.1网络编程简介

1、计算机网络:将不同地区的计算机使用网络连接 通过网络连接来实现数据交互以及数据共享

2、网络编程三要素:ip地址 端口号 协议

4.2IP地址

1、概念:每一台计算机 在网络通信中唯一的标识(相当于身份号)

2、分类:ip4 与ip6

3、ip4 是由四个二进制字节组成的 由于二进制记忆比较麻烦 于是转换ip4由十进制组成 每一部分以.进行分割

例如:

ip4:192.168.xxx

子网:10.1.xx

4、ip6是由十六进制组成

5、查看ip

A、widows+r+输入cmd

B、ipconfig

6、服务器检查是否能够正常连接 ping服务器的地址

ping+ip4地址

4.3、InetAddress

1、子类表示互联网协议(IP)地址

2、没有提供构造方法 不能实例化对象

3、常用方法

方法名称

方法描述

在给定主机名的情况下确定IP地址

返回IP地址字符串(以文本表现形式)

获取此IP地址的主机名

代码:

4.4、端口号

1、概念:每一个进程在网络中唯一的标识 每一一个应用在网络中唯一的标识

端口号可以自己设置 也可以由系统来进行分配

2、端口号的范围:

端口号的范围是:0-65535(unicode码表)系统的端口号 0-1024 一般自己设置端口号不会在这个系统端口号的范围内 如果设置可能会出现端口号被占用 设置端口号在0-1024范围之外

3、常见的应用默认端口号:

tomcat:8080

mysql:3306

oracle:1027

qq:4000

4.5、协议

1、网络通信过程中的一种规范 或者说是一种约束 必须遵循这个规范才能进行网络中的好友的数据交互

2、常见的协议

TCP:面向连接的协议 三握手 特点:效率低 安全性高 例如:发短信(单发)

UDP:面向连接的协议 特点:效率高 安全性低 数据丢失(丢包)例如:群发短信

HTTP协议:特点:一次性协议 效率高 安全性比较高 http协议的连接一般都称为钓鱼网站

HTTPS协议=HTTP+ssl证书 保证数据传输的安全性

4.6、基本TCP协议Socket通信

4.6.1简介

1、此类实现客户端套接字(也可以叫“套接字”),套接字是两台机器间通信的端点

4.6.2构造方法

方法名称

方法描述

public Socket(InetAddress address, intport)

创建一个流套接字并将其连接到指定IP地址的指定端口号

public Socket(String host, int port)

创建一个流套接字并将其连接到指定主机的指定端口号

4.6.2常用方法

方法名称

方法描述

public InputStream getInputStream()

返回套接字的输入流

public OutputStream getOutputStream()

返回套接字的输出流

public void shutdownOutput()

刷新(flush)

public void close()

关闭资源

4.7ServerSocket

4.7.1简介

1、此类实现服务器套接字。服务器套接字等待请求通过网络传入

4.7.2构造方法

方法的名称

方法的描述

public ServerSocket(int port)

创建绑定到特定端口的服务器套接字

4.7.3常用方法

方法名称

方法描述

public Socket accept()

侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞

public void close()

关闭此套接字

4.8基于TCP协议通信-传递简单的字符串

客户端

A、实例化Scocket

B、获取输入流与输出流对象

C、发送信息

D、接收信息

E、关闭资源

服务器

A、实例化ServerSocket

B、开启侦听

C、获取输入流与输出流对象

D、

客户端:

package com.gdk.test03; import java.io.*; import java.net.Socket; public class SocketStr { public static void main(String[] args) throws IOException { //实例化Socket Socket socket=new Socket("localhost",8989); //获取输入流和输出流对象 OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); String str="老王说:明天考试完,带你区按按摩"; //将字符串转换成字节数组 byte[] b = str.getBytes(); os.write(b); //刷新 socket.shutdownOutput(); //接收服务器传来的响应 BufferedReader br=new BufferedReader(new InputStreamReader(is)); String line=null; //使用循环读取 while ((line=br.readLine())!=null){ System.out.println(line); } //关闭资源 br.close(); is.close(); socket.close(); os.close(); } }

服务器:

package com.gdk.test03; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class ServerSocketStr { public static void main(String[] args) throws IOException { //实例化ServerSocket ServerSocket ss=new ServerSocket(8989); //开启侦听 Socket socket = ss.accept(); //获取输入流和输出流 OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); //使用高效流接收客户端的发送请求,字节转换成字符 BufferedReader br=new BufferedReader(new InputStreamReader(is)); //使用循环读取 String line=null; while ((line=br.readLine())!=null){ System.out.println(line); } //给客户端响应 String str="凤舞:最近有点虚,你可以叫老六和你一起去…………"; //将字符串转换成字节数组 byte[] b = str.getBytes(); os.write(b); //刷新 socket.shutdownOutput(); //关闭资源 socket.close(); os.close(); br.close(); is.close(); ss.close(); } }

4.9基于TCP协议通信-传输对象

演员类:

package com.gdk.test04; import java.io.Serializable; public class Actor implements Serializable { private String name; private int age; public Actor() { } public Actor(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Actor{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

客户端:

package com.gdk.test04; import java.io.*; import java.net.Socket; public class SocketObject { public static void main(String[] args) throws IOException { //实例化Socket对象 Socket socket=new Socket("localhost",8989); //获取输入输出流 InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); //实例化对象流-写入 ObjectOutputStream oos=new ObjectOutputStream(os); //实例化演员对象 Actor ac = new Actor("老王", 19); oos.writeObject(ac); //刷新 socket.shutdownOutput(); //接收服务器的响应 BufferedReader br=new BufferedReader(new InputStreamReader(is)); String line=null; while ((line=br.readLine())!=null){ System.out.println(line); } //关闭资源 br.close(); oos.close(); os.close(); is.close(); socket.close(); } }

服务器:

package com.gdk.test04; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerSocketObject { public static void main(String[] args) throws IOException, ClassNotFoundException { //实例化ServerSocket ServerSocket server=new ServerSocket(8989); //开启侦听器 Socket socket = server.accept(); //实例化输入输出流 InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); //实例化对象流-读取 ObjectInputStream ois=new ObjectInputStream(is); //返回一个Object类型,强转为Actor类型 Actor actor = (Actor) ois.readObject(); System.out.println(actor); //给客户端响应 String str="拉稀哥,收到了"; os.write(str.getBytes()); //刷新 socket.shutdownOutput(); //关闭资源 os.close(); ois.close(); is.close(); socket.close(); server.close(); } }

4.9.1基于TCP协议-传输文件

客户端:

package com.gdk.test05; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class SocketFile { public static void main(String[] args) throws IOException { //实例化Socket对象 Socket socket=new Socket("localhost",8989); //获取输出流 OutputStream os = socket.getOutputStream(); //实例化输入流对象 InputStream is=new FileInputStream("D:\\QF\\admin\\3.jpeg"); //使用循环读取 int leng=-1; byte [] bytes=new byte[1024]; while ((leng=is.read(bytes))!=-1){ os.write(bytes,0,leng); } //刷新 socket.shutdownOutput(); //关闭资源 os.close(); is.close(); socket.close(); } }

服务器:

package com.gdk.test05; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.UUID; public class ServerSocketFile { public static void main(String[] args) throws IOException { //实例化ServerSock ServerSocket server=new ServerSocket(8989); //开启侦听器 Socket socket = server.accept(); //获取输入流 InputStream is = socket.getInputStream(); //创建一个文件对象 File f=new File("d:\\QF\\adminb"); //判断文件是否存在 if (!f.exists()){ //创建文件夹 f.mkdirs(); } //生成唯一的名字 String name=(UUID.randomUUID()+"").replace("-","")+".jpeg"; //实例化输出流-写文件 OutputStream os=new FileOutputStream(new File(f,name)); //读取客户端写的图片 byte [] bytes=new byte[1024]; int leng=-1; while ((leng=is.read(bytes))!=-1){ os.write(bytes,0,leng); } //关闭资源 os.close(); is.close(); socket.close(); server.close(); } }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值