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 extends Student> c1 = Student.class;
//方法2
Student stu = new Student();
Class extends Student> 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方法获取字节码文件
2、通过反射机制操作类的内容//写一个配置文件Class.properties
path=com.dream.Reflex01.Student
获取了类的字节码文件对象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;
}



