栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-10-28

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-28

Java学习 day24 UDP协议

UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

通过UDP协议建立Clients之间的连接,并实现通话 Http协议
//创建一个URL类对象
URL url = new URL("https://www.baidu.com");

//获取连接对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setConnectTimeout(5000);//设置连接超时时间
connection.setReadTimeout(5000);//设置读取超时时间
connection.setDoInput(true);//设置是否允许使用输入流
connection.setDoOutput(true);//设置是否允许使用输出流
connection.setRequestMethod("GET");//设置请求方式

//获取响应状态码
int responseCode = connection.getResponseCode();
//判断响应状态码
if(responseCode  == HttpURLConnection.HTTP_OK){}
//获取
//获取数据
InputStream in = connection.getInputStream();
注解 反射

反射的含义:在Java中万物皆对象,我们想要执行任何类的操作,必须new类的对象,通过对象去间接完成对类的操作。在一个类中,如果我们想要操作类中的构造方法、成员属性、方法,需要new对象,而反射就是将这些构造方法、成员属性、方法映射成一个个对象,拿到映射后的构造方法,可以用它来生成对象;拿到映射后的方法,可以调用它来执行对应的方法;拿到映射后的字段,可以用它来获取或改变对应字段的值。

1、获取类文件对象

在Java中,代码首先会被编译为.class文件,然后执行,所以我们首先需要获取class字节码文件对象,获取进入类的入口。
获取类的字节码文件对象的三种方法:

//方法1

Class c1 = Student.class;

//方法2

Student stu = new Student();
Class c2 = stu.getClass();

方法3

Properties p = new Properties();//创建配置文件对象
p.load(Test.class.getClassLoader.getResourceAsStream(“ClassPath.properties”));//将配置文件Class.properties加载到对象中
String path = p.getProperty(“path”);//通过配置文件中的key值获取对应的value值
Class c3 = Class.forName(path);//通过forName方法获取字节码文件

//写一个配置文件Class.properties
path=com.dream.Reflex01.Student

2、通过反射机制操作类的内容

获取了类的字节码文件对象c,就可以在字节码文件对象上操作类中的构造方法、成员属性以及方法了。

通过反射机制来操作构造方法
//获取字节码文件对象
Class c = Class.forName(path);
//获取本类中所有public修饰的构造方法
Constructor[] constructors = c.getConstructors();
for (Constructor constructor : constructors) {
	System.out.println(constructor);
}
//获取本类中所有的构造方法
Constructor[] declaredConstructors = c.getDeclaredConstructors();
for (Constructor constructor : declaredConstructors) {
	System.out.println(constructor);
}
//通过反射机制根据无参构造创建对象
Constructor constructor = c.getConstructor();//创建无参构造方法的对象
Object obj = constructor.newInstance();//创建类对象
//通过反射机制根据有参构造创建对象
Constructor constructor = c.getDeclaredConstructor(String.class, char.class, int.class, String.class, String.class);//创建有参构造函数对象
constructor.setAccessible(true);//当要获取的类中的内容没用public修饰,需要加入这句话,表示设置修改权限
Object obj = constructor.newInstance("三上悠亚", '女', 18, "2111", "001");//创建类对象
通过反射机制来操作成员属性
//获取类字节码文件对象
Class c = Class.forName(path);
//获取本类中的全部属性
Field[] declaredFields = c.getDeclaredFields();
for (Field field : declaredFields) {
	System.out.println(field);
}
//获取父类中所有的属性
for (Class superClass = c.getSuperclass(); superClass != null; superClass = superClass.getSuperclass())//循环获取所有父类字节码文件对象
 {
	Field[] declaredFields = superClass.getDeclaredFields();
	for (Field field : declaredFields) {			  
		System.out.println(field);
	}
}
//获取本类私有化属性并设置
Field id = c.getDeclaredField("classId");
id.setAccessible(true);//设置操作权限
id.set(stu, "2112");
System.out.println(stu);
//获取获取值的修饰(访问修饰符+static+final)
int modifiers = id.getModifiers();
System.out.println("判断是否是private修饰:" + Modifier.isPrivate(modifiers));
通过反射机制来操作方法
//获取类字节码对象
Class c = Class.forName(path);
//获取本类及父类公有的方法
Method[] methods = c.getMethods();
for (Method method : methods) {
	System.out.println(method);
}
//获取本类所有的方法
Method[] methods = c.getDeclaredMethods();
for (Method method : methods) {
	System.out.println(method);
}
//获取本类所有方法
Method[] declaredMethods = c.getDeclaredMethods();
for (Method method : declaredMethods) {
	System.out.println(method);
}
//获取父类所有的方法
for(Class superClass =c.getSuperclass(); superClass != null; superClass = superClass.getSuperclass()) {
	Method[] methods = superClass.getDeclaredMethods();
	for (Method method : methods) {
		System.out.println(method);
	}
}
//获取本类中的方法并设置
Method declaredMethod = c.getDeclaredMethod("setId", String.class);//获取setId这个方法
declaredMethod.setAccessible(true);//设置修改权限
Object invoke = declaredMethod.invoke(stu, "002");//设置对象与值
System.out.println(invoke);
利用反射机制操作泛型 利用反射来进行数组扩容(万能的数组扩展)
public static void main(String[] args) throws UnknownHostException {
		
		int[] is = {1, 2, 3, 4};
		int[] is1 = copyArray(is, is.length*2);
		System.out.println(Arrays.toString(is1));

		String[] ss = {"aaa", "bbb", "ccc"};
		String[] ss1 = copyArray(ss, ss.length*2);
		System.out.println(Arrays.toString(ss1));
}
public static  T copyArray(T t, int newLength){
		//获取数组t的字节码文件对象
		Class arrayClass = t.getClass();
		//通过字节码文件对象获取数组t的类型
		Class componentType = arrayClass.getComponentType();
		//创建新的数组实例
		@SuppressWarnings("unchecked")
		T newArray = (T) Array.newInstance(componentType, newLength);
		//将原数组中的数据迁移到新数组中
		for (int i = 0; i < Array.getLength(t); i++) {
			 Object element = Array.get(t, i);
			 Array.set(newArray, i, element);
		}
		return newArray;
}	
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/358469.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号