Java基础一(思维导图)吐血整理

608 阅读2分钟

泛型

泛型类举例

public class GenericsClass<R,T> {

    private R first;
    private T second;

    public GenericsClass(R first, T second) {
        this.first = first;
        this.second = second;
    }

    public R getFirst() {
        return first;
    }

    public void setFirst(R first) {
        this.first = first;
    }

    public T getSecond() {
        return second;
    }

    public void setSecond(T second) {
        this.second = second;
    }

    public static void main(String [] args) {
        GenericsClass<Integer, String> genericsClass = new GenericsClass<>(1,"小明");
        System.out.println("泛型类测试:id="+genericsClass.getFirst()+",name="+genericsClass.getSecond());
    }
}

泛型方法举例

public class GenericsMethod {

    public static <T> void printParamType(T param) {
        System.out.println(param.getClass().getName());
    }

    public static void main(String [] args) {
        printParamType(1);
        printParamType("123");
        printParamType(BigDecimal.ZERO);
    }
}

反射

以一个Stundet类举例

public class Student {

    public String name;

    public int age;

    private double weight;//体重只有自己知道

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", weight=" + weight +
                '}';
    }
}

验证三种方式产生的Class对象在内存中是否是同一个

public static void main(String [] args) throws Exception{
        Class studentClass1 = Student.class;
        Class studentClass2 = new Student().getClass();
        Class studentClass3 = Class.forName("cn.lzq.web.api.reflect.Student");

        System.out.println(studentClass1==studentClass2);
        System.out.println(studentClass2==studentClass3);
    }

构造对象的两种方法

Class对象调用newInstance()方法

public static void main(String [] args) throws Exception{

        Class studentClass = Class.forName("cn.lzq.web.api.reflect.Student");
        Student s1 = (Student) studentClass.newInstance();
        System.out.println(s1.toString());
    }
 // Student{name='null', age=0, weight=0.0}

Constructor构造器调用newInstance()方法

public static void main(String [] args) throws Exception{
        Class studentClass = Class.forName("cn.lzq.web.api.reflect.Student");
        Constructor constructor = studentClass.getConstructor(String.class, int.class, double.class);
        Student student = (Student) constructor.newInstance("小菠萝", 12, 60.0);
        System.out.println(student.toString());
    }
 //Student{name='小菠萝', age=12, weight=60.0}

通过反射调用方法

/**
     * 增加并输出体重
     * @param addWeight
     */
    public void addAndPrintWeight(double addWeight) {
        this.weight = this.weight+addWeight;
        System.out.println("name="+name+",weight="+weight);
    }
public static void main(String [] args) throws Exception{
        Class studentClass = Class.forName("cn.lzq.web.api.reflect.Student");
        Constructor constructor = studentClass.getConstructor(String.class, int.class, double.class);
        constructor.setAccessible(true);
        Student student = (Student) constructor.newInstance("小菠萝", 12, 60.0);
        Method method = studentClass.getMethod("addAndPrintWeight", double.class);
        if (method != null) {
            method.invoke(student, 0.5);
        }
    }
//name=小菠萝,weight=60.5

IO

image.png

NIO编程示例

服务端

public class NIOServer {

    public static void main(String [] args) {
        try {
            //创建一个多路复用器
            Selector selector = Selector.open();
            //创建一个ServerSocket通道,并监听8080端口
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open().bind(new InetSocketAddress(8080));
            //设置为非阻塞
            serverSocketChannel.configureBlocking(false);
            //监听接收数据的事件
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

            while (true) {
                selector.select();
                //拿到Selector关心的已经达到的事件的SelctionKey集合
                Set keys = selector.selectedKeys();
                Iterator iterator = keys.iterator();
                while (iterator.hasNext()) {
                    SelectionKey selectionKey = (SelectionKey) iterator.next();
                    iterator.remove();
                    if (selectionKey.isAcceptable()) {
                        //拿到产生这个事件的通道
                        ServerSocketChannel serverChannel = (ServerSocketChannel) selectionKey.channel();
                        SocketChannel clientChannel = serverChannel.accept();
                        clientChannel.configureBlocking(false);
                        //并为这个通道注册一个读事件
                        clientChannel.register(selectionKey.selector(), SelectionKey.OP_READ);
                    } else if (selectionKey.isReadable()) {
                        SocketChannel clientChannel = (SocketChannel) selectionKey.channel();
                        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                        long bytesRead = clientChannel.read(byteBuffer);
                        while (bytesRead>0) {
                            byteBuffer.flip();
                            System.out.println("来自客户端的数据:"+new String(byteBuffer.array()));
                            byteBuffer.clear();
                            bytesRead = clientChannel.read(byteBuffer);
                        }
                        byteBuffer.clear();
                        byteBuffer.put("客户端你好,数据我收到了".getBytes());
                        byteBuffer.flip();
                        clientChannel.write(byteBuffer);
                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

public class NIOClient {

    public static void main(String [] args) {
        try {
            Selector selector = Selector.open();
            SocketChannel clientChannel = SocketChannel.open();
            clientChannel.configureBlocking(false);
            clientChannel.connect(new InetSocketAddress(8080));
            clientChannel.register(selector, SelectionKey.OP_CONNECT);
            while (true) {
                //如果事件没到达就一直阻塞着
                selector.select();
                Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
                while (iterator.hasNext()) {
                    SelectionKey key = iterator.next();
                    iterator.remove();
                    if (key.isConnectable()) {
                        /**
                         * 连接服务器端成功
                         *
                         * 首先获取到clientChannel,然后通过Buffer写入数据,然后为clientChannel注册OP_READ事件
                         */
                        clientChannel = (SocketChannel) key.channel();
                        if (clientChannel.isConnectionPending()) {
                            clientChannel.finishConnect();
                        }
                        clientChannel.configureBlocking(false);
                        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                        byteBuffer.clear();
                        byteBuffer.put("服务端你好,我是客户端".getBytes("UTF-8"));
                        byteBuffer.flip();
                        clientChannel.write(byteBuffer);
                        clientChannel.register(key.selector(), SelectionKey.OP_READ);
                    } else if (key.isReadable()) {
                        //通道可以读数据
                        clientChannel = (SocketChannel) key.channel();
                        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                        long bytesRead = clientChannel.read(byteBuffer);
                        while (bytesRead > 0) {
                            byteBuffer.flip();
                            System.out.println("server data :" + new String(byteBuffer.array()));
                            byteBuffer.clear();
                            bytesRead = clientChannel.read(byteBuffer);
                        }
                    } else if (key.isWritable() && key.isValid()) {
                        //通道可以写数据
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}