泛型
泛型类举例
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
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();
}
}
}