今天的主要内容有:UDP编程:发送数据包和接受数据包;反射:类对象的三种获取方式,通过反射获取构造方法,属性,方法并使用。

Day34

*UDP编程:发送者和接受者,两者直接不会产生连接。(不安全的,在信息传输过程中可能会发生数据包的丢失)

package com.qianfeng.am.demo1;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;/*** @author 吴一凡*    UDP里的发送者*/
public class TestUDPSend {public static void main(String[] args) {try {//·1.构建一个UDPsocket对象,发射器DatagramSocket ds = new DatagramSocket();//·需要发送的信息String msg = "大仙的头发呢?";//·2.构建一个数据包//·两个参数:第一个是发送消息的字节数组,第二个是发送消息的长度DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.getBytes().length);//·给数据包设定地址dp.setSocketAddress(new InetSocketAddress("129.28.161.", 7777));//·3发送这个数据包,用发射器发射数据包ds.send(dp);//·4.关闭udp对象ds.close();} catch (Exception e) {e.printStackTrace();}}
}package com.qianfeng.am.demo1;import java.net.DatagramPacket;
import java.net.DatagramSocket;/*** @author 吴一凡*   UDPb的接受者*/
public class TestUDPreceive {public static void main(String[] args) {try {//·1.构建一个UDP对象,指定一个端口,接收器DatagramSocket ds = new DatagramSocket(7777);//·2构建一个接受数据的数据包byte[] bts = new byte[1024*10];//·数据包对象存不了信息,而是存到字节数组中,0是起始位置DatagramPacket dp = new DatagramPacket(bts,0,bts.length);//·3.读取数据包里面的内容,在没有接收到数据时,这里会阻塞等待接受数据ds.receive(dp);//·用接收器接受发送端传过来的信息,放到数据包中并保存在字节数组中//·4读取数据,这里用dp.getLength代表接受到的数据的长度String msg = new String(bts, 0, dp.getLength());//·5关闭udpds.close();} catch (Exception e) {e.printStackTrace();}}}

*反射: 通过.class来得到对象,属性,方法的一种手段

  • 类对象和它的三种获取方式:类对象就是类加载时的产物(.class文件),封装了一个类的所有信息(类名,父类,接口,属性,方法,构造方法)
public class Person {}public class Test {//·单例模式:程序运行期间,Person这个类只有一个对象public static void main(String[] args) throws ClassNotFoundException {//·正常获得对象的方式Person p = new Person();//·三种获取Person的类对象//·方法1:通过对象.getClass() 来获取Class c1 = p.getClass();//·方法2:通过类名.class来获取Class c2 = Person.class;//·方法3:通过静态方法来获取Class c3 = Class.forName("com.qianfeng.am.demo2.Person");}
}
  • 通过反射获取构造器并且创建对象。
import java.lang.reflect.Constructor;
/*** @author 吴一凡*  通过.class对象获取类的构造器*/
public class Demo1 {public static void main(String[] args) throws Exception {Class c = Person.class;//·获取所有公开的构造器Constructor[] ct = c.getConstructors();//·获取所有的构造器(全部都能拿到)Constructor[] ct1 = c.getDeclaredConstructors();}
}package com.qianfeng.pm.demo1;import java.lang.reflect.Constructor;/*** @author 吴一凡*  通过获取构造器来创建对象*/
public class Demo2 {public static void main(String[] args) throws Exception {Class c = Person.class;//·获取公共的无参构造Person p1 = (Person) c.newInstance();//·默认用无参构造器创建对象//·获取无参的构造器Constructor constructor1 = c.getConstructor();Person p2 = (Person) constructor1.newInstance();//·获取带有参数的构造器Constructor constructor2 = c.getConstructor(int.class);Person p3 = (Person) constructor2.newInstance(6);//·这里的实参必须和获取构造器时的数据类型一致}
}package com.qianfeng.pm.demo1;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;/*** @author 吴一凡*   获取私有的构造器,并且能够实例化对象*/
public class Demo3 {public static void main(String[] args) {Class c = Person.class;try {//·得到私有的构造器Constructor dc = c.getDeclaredConstructor(String.class);//·在JVM的底层如果一个方法、属性、构造器是私有的,访问开关的boolean值为false//·而这里就是强制将这个开关改为true,这样就可以访问私有的了。dc.setAccessible(true);Person p = (Person) dc.newInstance("jack");} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}
}
  • 通过反射获取属性,并且修改对象的属性的
package com.qianfeng.pm.demo2;public class Person {public String name;private int age = 20;char sex;protected int id;
}package com.qianfeng.pm.demo2;import java.lang.reflect.Field;/*** @author 吴一凡*    通过反射来获取所有属性*/
public class Demo1 {public static void main(String[] args) throws Exception {Class c = Person.class;//·根据属性的名称,来获取这个属性对象Field field = c.getField("name");//·只能获取到public修饰的属性Field field1 = c.getDeclaredField("age");//·不管这个属性是什么修饰的都能访问到//·获取所有被public修饰的属性Field[] fields = c.getFields();//·获取所有的属性Field[] fields1 = c.getDeclaredFields();}
}package com.qianfeng.pm.demo2;import java.lang.reflect.Field;/*** @author 吴一凡*    修改私有属性的值,访问一个私有属性*/
public class Demo2 {public static void main(String[] args) throws Exception {//·1 得到这个属性Class c = Person.class;//得到一个属性对象Field f = c.getDeclaredField("age");//·破解私有属性的开关f.setAccessible(true);//·必须用对象才能访问这个对象的属性Person p = (Person) c.newInstance();//·使用属性对象调用方法获得实参对象的该属性的值int p_Age = f.getInt(p);//·通过f对象调用getInt方法(实参为p),来获取p的age属性的值System.out.println(p_Age);//对这个对象的属性的值进行修改f.setInt(p, 100);Object obj = f.get(p);System.out.println(obj);}
}
  • 通过反射获取方法,并且调用对象的属性
package com.qianfeng.pm.demo3;public class Person {public void test1() {System.out.println("test1");}protected void test2() {System.out.println("test2");}void test3() {System.out.println("test3");}private void test4() {System.out.println("test4");}
}package com.qianfeng.pm.demo3;import java.lang.reflect.Method;/*** @author 吴一凡*   通过反射获取方法*/
public class Demo1 {public static void main(String[] args) throws Exception {Class c = Person.class;//·根据方法名获取public修饰的方法Method m1 = c.getMethod("test1");//·根据方法名来获取任意一个方法Method m2 = c.getMethod("test2");//·获取所有公开的方法Method[] me1 = c.getMethods();//·获取所有的方法Method[] me2 = c.getDeclaredMethods();}
}package com.qianfeng.pm.demo3;import java.lang.reflect.Method;/*** @author 吴一凡*   调用通过反射获取到的方法*/
public class Demo2 {public static void main(String[] args) throws Exception {Class c = Person.class;//·获取到了一个私有方法Method m1 = c.getDeclaredMethod("test4");//·如果调用这个方法?必须通过对象调用Object obj = c.newInstance();//·调用默认的无参构造创建对象//·因为是私有方法,所以必须打开访问权限m1.setAccessible(true);//·用invoke方法去执行obj对象的方法m1.invoke(obj);//·如果获取的方法有返回值,有参数怎么办?//·首先在获取方法时,形参列表要一致Method m2 = c.getDeclaredMethod("add",int.class,int.class);m2.setAccessible(true);//·其次调用invoke方法时传参,并接受返回值(用object类型接受,多态)Object result = m2.invoke(obj,10,20);System.out.println(result);}
}

*反射的两个使用案例

  • 案例1:通过反射,获取报名,并且获取这个包下面所有的.class文件
import java.io.File;
import java.io.FileFilter;public class Demo1 {public static void main(String[] args) {test(Demo1.class);}//·找到c下面同包的所有.class文件public static void test(Class c) {//·获取这个字节码文件所在包的包对象Package package1 = c.getPackage();//·获取这个包的包名String pkName = package1.getName();
//      System.out.println(pkName);/** 此时pkName = com.qianfeng.pm.demo4* 需要改成 bin\\com\\qianfeng\\pm\\demo4*/pkName = "bin\\"+pkName.replace(".", "\\");//·得到一个file对象File file = new File(pkName);//·得到以.class结尾的文件File[] lf = file.listFiles(new FileFilter() {@Overridepublic boolean accept(File file) {if(file.getName().endsWith(".class")) {if(file.isFile()) {return true;}}return false;}});for (File file2 : lf) {System.out.println(file2.getName());}}
}
  • 案例2:在不知道数组类型的情况下,对数组进行扩容
import java.lang.reflect.Array;public class Demo2 {public static void main(String[] args) {String[] a = {"a","b","c"};String[] b = (String[]) copyArrays(a, 5);for (String string : b) {System.out.println(string);}}public static Object copyArrays(Object obj, int newLength) {Class cls = obj.getClass();//·判断是不是数组if(cls.isArray()) {//·获取这个数组的类型的类对象Class type = cls.getComponentType();//·根据这个类型和传进来的新长度创建一个新数组Object newArray = Array.newInstance(type, newLength);//·将旧数组的元素,copy到新数组中去System.arraycopy(obj, 0, newArray, 0, Array.getLength(obj));return newArray;}return null;}
}

千峰JAVA逆战班Day34相关推荐

  1. 千峰JAVA逆战班Day49

    Day49 *下载文件案例:就是使用IO传输数据 private String resourceLocation = "D:\\Users\\t\\nginx-1.17.2\\html\\a ...

  2. 千峰JAVA逆战班Day35

    Day35 *注解:就是给代码中的方法,属性,参数等贴上了一个标签 注解的定义:@interface 注解名字 public @interface MyAnno{} 用法:在你想要贴上注解的地方的前面 ...

  3. 千峰JAVA逆战班Day38

    Day38 *连接查询:必须是两个或以上表之间且一定有主外键关系,才能进行连接查询 ​ I. 内连接:inner join on SELECT bid,bname,bprice,book.`tid`, ...

  4. 千峰JAVA逆战班Day40

    Day40 *对执行DQL的方法进行封装 ​ I. 连接,设置参数等方式跟封装DML是一样的,但是DQL返回的是一个结果集,所以需要对这个结果集进行处理.那么怎么处理呢?自然是封装到一个集合当中进行返 ...

  5. 千峰JAVA逆战班Day47

    Day47 *服务器的请求流程: *请求的方式:get 和 post,请求分为请求头和请求体 ​ I. get 请求的信息会直接显示在网页的地址栏. ​ II. post 请求的信息不会直接显示在网页 ...

  6. 千峰JAVA逆战班Day36

    Day36 *二阶段介绍:通过前端网页,将我们后台写的逻辑代码和数据,去供别人使用 *数据库(有服务端和客户端 ): ​ I. 可以用txt等文件存储,为什么还需要数据库? ​ 因为使用数据库存储会更 ...

  7. 千峰JAVA逆战班Day48

    Day48 *在昨天的注册案例上加一个功能:用户注册之后,给用户返回一个html页面,告知用户注册成功,且有用户的所有信息(必须是中文) ​ I. 如果需要有中文,那么中文乱码问题肯定是要考虑的:所以 ...

  8. 千峰JAVA逆战班Day37

    Day37 *DQL语句(数据库查询语句) I. 关系型数据库:表与表之间可以建立关系:称之为主外键. ​ 主键:在一个表中可以唯一标识一条记录,不能重复,不可为空. ​ 外键:当前表中的外键指的是另 ...

  9. 字节跳动面试官:千峰java培训多少钱

    并发编程三大特性 原子性 一个操作或者多次操作,要么所有的操作全部都得到执行并且不会受到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行. 对于基本数据类型的访问,读写都是原子性的[long和 ...

  10. 千峰java 笔记整理_千锋--多线程笔记

    进程:正在运行的程序 多线程处于宏观上的并行/微观上的串行状态 第一种实现多线程的方法: 新增类继承Thread 重写run方法 在测试类中创建子对象调用start()方法启动该子线程 第二种实现多线 ...

最新文章

  1. 异步调用WCF的方法需要小心的地方
  2. linux安装phoenix 5.1.0(对应hbase 2.2.6)
  3. SQL Server 表变量和临时表的区别
  4. POE工业交换机的四种接法详解
  5. php文件锁 阻塞区别,php文件锁阻塞模式和非阻塞模式
  6. CGGeometry.h详解
  7. 星河经纬加入会员可靠吗_星河湾外墙防水补漏 星河湾外墙防水补漏公司 星河湾外墙防水补漏师傅 星河湾外墙防水补漏施工队电话...
  8. 麦克纳姆轮全向移动机器人运动学模型应用
  9. Python数据结构与算法(3.1)——栈
  10. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-6.Mysql逆向工程效率神器之使用IDE自动生成Java实体类...
  11. Android 单元测试只看这一篇就够了
  12. mro列表_方法解析顺序(MRO)
  13. Oracle常见授权与回收权限——grant和revoke
  14. 设置ubuntu1920*1080分辨率
  15. 微信公众号关注页、微信关注链接 微信7.0 IOS 安卓
  16. linux服务器的完整部署内容详细
  17. 京东七夕报名要注意什么?四川万顿思
  18. 容器编排之战——kubernetes
  19. 青岛市人才市场2008年11月份交流会安排
  20. arduino 计时器和中断

热门文章

  1. 20个高权重的博客列表
  2. java重构工具_Piranha(陈旧代码自动重构工具)
  3. 11尺寸长宽 iphone_iPhone11屏幕尺寸
  4. ftp下出现“当前的安全设置不允许从该位置下载文件”提示
  5. linux彻底清除历史记录
  6. UserBehavior 阿里巴巴淘宝用户行为数据字段分析
  7. 手机python软件哪个好用_如何在手机上学习python编程?有哪些软件可以使用?
  8. 康诺特酒吧摘得2021全球50家最佳酒吧桂冠;华住与京能集团达成战略合作 | 全球旅报...
  9. 计算机派位志愿填报技巧,小升初电脑派位操作流程详解
  10. 为什么计算机关机慢,XP系统为什么电脑关机慢?