Java 基础杂学笔记
反射
基础概念
- 见下图。
![反射概念]()
获取 class 对象
三种方式(注意区分 class 的大小写):
Class.forName("全类名")类名.class(【特殊】一个基础类型示例int.class)对象.getClass()
获取构造方法
关键:Constructor 类
其余见下:


获取成员变量
关键:Field 类
细节:
-
四种获取成员变量的方法,与上面类似,略。
-
Field 类中操作对象的方法:
void set(Object obj, Object value):赋值Object get(Object obj):获取值
获取成员方法
关键:Method 类、Parameter 类
细节:
-
四种获取成员方法的方法,与上面大同小异,略。
-
使用 Method 类运行成员方法:
Object invoke(Object obj, Object... args)
反射应用
-
利用反射动态创建对象和运行方法(结合配置文件)
-
保存任意对象数据
📝 一些思考:视频里的写法只考虑了成员变量是基础类型或 String 的情况,还是存在局限性?如果对象的某个成员是另一个对象,这样或许需要递归地保存?
附上示例代码(含获取成员方法部分):
点击查看代码
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.nio.Buffer;
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, IOException {
Class clazz = Class.forName("Student");
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
Method m = clazz.getDeclaredMethod("eat", String.class);
System.out.println(m);
int modifiers = m.getModifiers();
System.out.println(modifiers);
String name = m.getName();
System.out.println(name);
Parameter[] parameters = m.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter);
}
Class[] exceptTypes = m.getExceptionTypes();
for (Class exceptType : exceptTypes) {
System.out.println(exceptType);
}
Student s = new Student();
m.setAccessible(true);
Object result = m.invoke(s, "Egg");
System.out.println(result);
saveObject(s);
}
// 保存对象
public static void saveObject(Object obj) throws IOException, IllegalAccessException {
Class clazz = obj.getClass();
BufferedWriter bw = new BufferedWriter(new FileWriter("./student.txt"));
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String name = field.getName();
Object value = field.get(obj);
bw.write(name + " = " + value);
bw.newLine();
}
bw.close();
}
}
class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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; }
private String eat(String food) throws IOException, NullPointerException {
System.out.println("eat " + food);
return "OK";
}
}
动态代理
核心:java.lang.reflect.Proxy 下的 newProxyInstance 方法(见下图)、公共接口的定义

具体使用方法,篇幅原因,略。(⚠️ 不太容易哦,视频里没有涉及到一些深层的点,如类加载器细节、多接口情况、第三个参数细节等)
网络编程
基础概念
- 网络编程三要素:IP、端口、协议
- 单播、组播、广播
- 本机 IP 地址:127.0.0.1
- 私有 IP 地址(如 192.168.0.0 - 192.168.255.255,分 A 类、B 类和 C 类)
- 组播地址(224.0.0.0 - 239.255.255.255)【更多细节略】
InetAddress 类
static InetAddress getByName(String host):获取主机名称对应 IP 地址(host 参数可以是 IP 地址);String getHostName():获取 IP 对应主机名;String getHostAddress()
UDP 通信
- 关键:DatagramSocket 类、DatagramPacket 类
示例代码:
发送端(点击查看代码)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendMessageDemo {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
String s = "Hello, world!";
byte[] bytes = s.getBytes();
InetAddress ip = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, ip, port);
ds.send(dp);
ds.close();
}
}
接收端(点击查看代码)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReceiveMessageDemo {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(10086);
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
System.out.println("1111");
ds.receive(dp);
System.out.println("2222");
byte[] data = dp.getData();
int len = dp.getLength();
InetAddress ip = dp.getAddress();
int port = dp.getPort();
System.out.println("Data: " + new String(data, 0, len));
System.out.println("IP: " + ip + " Port: " + port);
ds.close();
}
}
⚠️ 注意:先运行接收端代码,再运行发送端。
- 组播相关:MulticastSocket 类
示例代码:
组播发送端(点击查看代码)
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MuticastSendDemo {
public static void main(String[] args) throws Exception {
MulticastSocket ms = new MulticastSocket();
String s = "Hello, world!";
byte[] bytes = s.getBytes();
InetAddress address = InetAddress.getByName("225.0.0.1");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
ms.send(dp);
ms.close();
}
}
组播接收端(点击查看代码)
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MulticastReceiveDemo {
public static void main(String[] args) throws Exception {
MulticastSocket ms = new MulticastSocket(10000);
InetAddress address = InetAddress.getByName("225.0.0.1");
ms.joinGroup(address);
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ms.receive(dp);
byte[] data = dp.getData();
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String name = dp.getAddress().getHostName();
System.out.println("Name: " + name + " IP: " + ip + " Data: " + new String(data, 0, len));
ms.close();
}
}
TCP 通信
- 关键:Socket 类、ServerSocket 类
- 通过 Socket 产生的 IO 流 进行通信(注意 IO 流在客户端和服务端的流向。例如,客户端的输出流,对于服务端来说,是输入流)
示例代码:
客户端(点击查看代码)
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 10000);
OutputStream ostream = socket.getOutputStream();
ostream.write("你好,1234567".getBytes());
ostream.close();
socket.close();
}
}
服务端(点击查看代码)
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10000);
Socket socket = ss.accept();
InputStream istream = socket.getInputStream();
InputStreamReader isreader = new InputStreamReader(istream);
BufferedReader bReader = new BufferedReader(isreader);
int b;
while ((b = bReader.read()) != -1) {
System.out.print((char)b);
}
System.out.println();
socket.close();
ss.close();
}
}


浙公网安备 33010602011771号