package com.itheima.domain;
public class Student {
//1.成员变量私有化
//2.空参,带参构造方法
//3.对于私有的成员变量,提供对应的setXxx和getXxx方法
//4.可以使用插件ptg一键生成
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
package com.itheima.myreflect;
import com.itheima.domain.Student;
public class MyReflect1 {
public static void main(String[] args) throws ClassNotFoundException {
/**
* 反射允许对成员变量,成员方法和构造方法的信息进行编程访问
* 获取class对象的三种方式:
* 1.Class.forName("全类名") 源代码阶段使用
* 2.类名.class 加载阶段使用
* 3.对象.getClass(); 运行阶段使用
*/
//1.第一种方式
//全类名:包名+类名
//最为常用的
Class clazz1 = Class.forName("com.itheima.domain.Student");
//2.第二种方式
//一般更多的是当做参数进行传递
Class clazz2 = Student.class;
//3.第三种方式
//当我们已经有了这个类的对象时,才可以使用
Student student=new Student();
Class clazz3 = student.getClass();
}
}
package com.itheima.myreflect;
import com.itheima.domain.Student;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;
public class MyReflect2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
/**
* 获取class对象 Class
* 构造方法 Constructor
* 字段(成员变量)Field
* 成员方法 Method
*/
/**
* Class类中用于获取构造方法的方法
* Constructor>[] getConstructors()
* Constructor>[] getDeclaredConstructors()
* Constructor[] getConstructors(Class>... parameterTypes)
* Constructor[] getDeclaredConstructors(Class>... parameterType)
*
* Constructor类中用于创建对象的方法
* T newInstance(Object... initargs)
* setAccessible(boolean flag)
*
*/
//1.获取class字节码文件对象
Class clazz = Class.forName("com.itheima.domain.Student");
/*//2.获取构造方法
Constructor[] cons=clazz.getConstructors();
for (Constructor con : cons) {
System.out.println(con);
}*/
/*Constructor[] cons = clazz.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con);
}*/
Constructor con1 = clazz.getDeclaredConstructor();
System.out.println(con1);
Constructor con2 = clazz.getDeclaredConstructor(String.class);
System.out.println(con2);
Constructor con3 = clazz.getDeclaredConstructor(int.class);
System.out.println(con3);
Constructor con4 = clazz.getDeclaredConstructor(String.class,int.class);
System.out.println(con4);
//3.构造方法的使用
//获取权限修饰符
int modifiers = con4.getModifiers();
//获取参数
Parameter[] parameters = con4.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter);
}
//使用构造方法创建对象
//暴力反射:表示临时取消权限校验
con4.setAccessible(true);
Student stu = (Student) con4.newInstance("张三", 20);
System.out.println(stu);
}
}
package com.itheima.myreflect;
import com.itheima.domain.Student;
import java.lang.reflect.Field;
public class MyReflect3 {
/**
* Class类中用于获取成员变量的方法
* Field[] getFields(); 返回所有公共成员变量对象的数组
* Field[] getDeclareFields() 返回所有成员变量对象的数组
* Field[] getFields(String name) 返回单个公共成员变量对象
* Filed[] getDeclareFields(String name) 返回单个成员变量对象
*
* Field类中用于创建对象的方法
* void set(Object obj,Object value) 赋值
* Object get(Object obj) 获取值
*/
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
//1.获取class字节码文件对象
Class clazz = Class.forName("com.itheima.domain.Student");
//2.获取所有成员变量
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
//获取单个成员变量
Field name = clazz.getDeclaredField("name");
//获取权限修饰符
int modifiers = name.getModifiers();
//获取成员变量的名字
String n = name.getName();
//获取成员变量的数据类型
Class type = name.getType();
//获取成员变量记录的值
Student student = new Student("lisi", 23, "女");
name.setAccessible(true);
String value= (String) name.get(student);
System.out.println(value);
}
}
package com.itheima.myreflect;
import com.itheima.domain.Student;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class MyReflect4 {
/**
* Class类中用于获取成员方法的方法
* Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
* Method[] getDeclearMethods():返回所有成员方法对象的数组,不包括继承的
* Method[] getMethods(String name,Class>...parameterTypes):返回单个公共成员方法对象
* Method[] getDeclearMethods(String name,Class>...parameterTypes):返回单个成员方法对象
*
*Method类中用于创建对象的方法
* Object invoke(Object obj,Object...args) 运行方法
* 参数一:用obj对象调用该方法
* 参数二:调用方法的传递参数(如果没有就不写)
* 返回值:方法的返回值(如果没有就不写)
* 获取方法的修饰符
* 获取方法的名字
* 获取方法的形参
* 获取方法的返回值
* 获取方法的抛出的异常
*
*
*/
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//1.获取字节码文件对象
Class clazz = Class.forName("com.itheima.domain.Student");
//2.获取里面所有的方法对象(包括父类中所有的公共方法)
/*Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method);
}*/
//2.获取里面所有的方法对象(不能获取父类的,但是可以获取本类中私有的)
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
//获取指定的单一方法
Method declaredMethod = clazz.getDeclaredMethod("eat", String.class);
//获取方法的修饰符
int modifiers = declaredMethod.getModifiers();
//获取方法的名字
String name = declaredMethod.getName();
//获取方法的形参
Parameter[] parameters = declaredMethod.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter);
}
//获取方法抛出的异常
Class[] exceptionTypes = declaredMethod.getExceptionTypes();
//方法运行
/* Method类中用于创建对象的方法
* Object invoke(Object obj,Object...args) 运行方法
* 参数一:用obj对象调用该方法
* 参数二:调用方法的传递参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)*/
Student s=new Student();
declaredMethod.setAccessible(true);
//参数一s:表示方法的调用者
//参数二"汉堡包":表示在调用方法的时候传递的实际参数
//result 方法的返回值
String result = (String) declaredMethod.invoke(s, "汉堡包");
System.out.println(result);
}
}
1.Java Socket Server Examples (TCP/IP):https://www.codejava.net/java-se/networking/java-socket-server-examples-tcp-ip
2.A Guide to Java Sockets:https://www.baeldung.com/a-guide-to-java-sockets
3.Spring Boot 搭建TCP Server:https://juejin.cn/post/6844904020264370183
4.SpringBoot 2 整合 Netty 实现基于 DTU 的 TCP 服务器 之 服务端:https://www.jianshu.com/p/3f11370a69e7
5.一文读懂网络框架 Netty:https://www.infoq.cn/article/398qn2sicbswudtusm5c