一、元注解
@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(); } }