JAVA基础之网络编程2、反射


前言

今天学习了网络编程的服务端多线程接收多个客户端、以及反射的基本概念


一、网络编程

我们想让服务端接收多个客户端的消息。并返回给客户端,是否登录成功

方法1:采用whlie循环
示例代码入戏:

   public static void main(String[] args) throws IOException {
        System.out.println("我是服务器端");
        //服务器端
        ServerSocket serverSocket = new ServerSocket(9998);
        Boolean flag = true;
        while (flag){//这里必须用flag变量,不然java会认为while是死循环,无法关闭serverSocket
//接收数据以及判断条件

}

方法2:采用多线程。
*示例代码所示:

public class Class_17_ThreadServer {
    public static void main(String[] args) throws IOException {
        System.out.println("我是服务器端");
        //服务器端
        ServerSocket serverSocket = new ServerSocket(9998);
        Boolean flag = true;
        while (flag) {
            Socket client = serverSocket.accept();
            new Thread(new Thread_Client(client)).start();
            new Thread(new Thread_Client(client)).start();
        }
        serverSocket.close();
    }

}

class Thread_Client implements Runnable {
    private Socket socket;
    private DataInputStream in = null;
    private DataOutputStream os = null;

    public Thread_Client() {
    }

	//定义初始化的输入流和输出流
    public Thread_Client(Socket socket) throws IOException {
        this.socket = socket;
         in = new DataInputStream(socket.getInputStream());
         os = new DataOutputStream(socket.getOutputStream());
    }

	//获取输入流
    public String read() throws IOException {
        return in.readUTF();
    }

    //判断数据
    public Boolean judgement_user(String str1) {
        String[] newstr = str1.split("&");
        String username = newstr[0].substring(newstr[0].indexOf("=") + 1);
        String password = newstr[1].substring(newstr[1].indexOf("=") + 1);
        if ("华哥".equals(username) && "1234".equals(password)) {
            return true;
        } else {
            return false;
        }
    }
    //获取输出流,将结果响应给客户端

    @Override
    public void run() {
        try {
            //分割数据并判断
            String str1 = read();
            if (judgement_user(str1)) {
                os.writeUTF("登录成功");
            } else {
                os.writeUTF("登录失败");
            }
            os.flush();
            os.close();
            in.close();
            socket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

二、反射

1.什么是反射

反射(Reflection):JAVA的一个动态的机制

注意 : 反射发生在程序允许运行期间

反射的作用 :
            ①在运行时判断任意一个对象所属的类;
            ②在运行时构造任意一个类的对象;
            ③在运行时判断任意一个类所具有的成员变量和方法;
            ④在运行时调用任意一个对象的方法;
            ⑤生成动态代理;

反射的源头 :一个类型的Class对象 Class : 类Class的实例表示正在运行的 Java应用程序中的类和接口。存在于类加载到内部之后,独一份的,不会改变的,Class对象中封装着类的所有内容

获取反射的源头 :
        1.类名.class
        2.对象.getClass()
        3.Class.forName("权限定名:包名.类名")   -->推荐

示例代码所示:

public class Class_01_Reflection {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.类名.class
        Class<String> cls1 = String.class;
        System.out.println(cls1.toString());
        //2.对象.getClass()
        Class cls2 = "abc".getClass();
        System.out.println(cls2);
        System.out.println(cls2==cls1);
        //3.Class.forName("权限定名:包名.类名")   -->推荐
        Class cls3 = Class.forName("java.lang.String");
        System.out.println(cls3);
        Class<?> str = Class.forName("java.lang.String");
        System.out.println(str.getTypeName());

    }
}

2.反射常用的方法

代码如下所示::


/*
    Class类常用方法 :
        1.String getName()  返回此Class对象表示的实体(类、接口、数组类、原始类型或 void)的名称。
        2.Class<?>[] getInterfaces() 返回此Class对象表示的类或接口直接实现的接口。
        3.Class<?>[] getInterfaces() 返回此Class对象表示的类或接口直接实现的接口。
        4.int getModifiers() 返回此类或接口的 Java 语言修饰符,以整数编码。
        5.String getPackageName() 返回完全限定的包名称。
        6.String getSimpleName() 返回源代码中给出的基础类的简单名称。
        7.boolean isPrimitive() 确定指定的Class对象是否表示原始类型。
        8.boolean isInterface() 确定此Class对象是否表示接口类型。
        9.boolean isEnum() 当且仅当此类在源代码中声明为枚举时才返回 true。
        10.boolean isAnnotation() 如果此Class对象表示注释接口,则返回 true。
 */
public class Class_02_Reflection {
    public static void main(String[] args) {
        //String类型
        Class<?> str = "hhh".getClass();
        System.out.println(str.getSimpleName());
        System.out.println(str.isArray());
        //List集合类型
        List<String> list = new ArrayList<>();
        Class<List> str1 = (Class<List>) list.getClass();
        System.out.println(Modifier.toString(str1.getModifiers()));
        //数组类型
        int[] arr = new int[12];
        Class<int[]> arr1 = (Class<int[]>) arr.getClass();
        System.out.println(Modifier.toString(arr1.getModifiers()));
        System.out.println(arr1.getSimpleName());


    }
}

输出结果如下:
在这里插入图片描述


总结

这就是对今天所学的总结。状态不好,明天继续加油!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值