在千锋“逆战”学习第34天
每日一句:作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。
今天主要学习了反射中的类对象知识。
明天继续努力。
课堂案例
网络编程:注册与登陆
public class Client {
public void reg() {
try {
Socket client = new Socket("192.168.2.100",9999);
ClientRegThread crt = new ClientRegThread(client);
crt.start();
crt.join();
} catch (Exception e) {
e.printStackTrace();
}
}
public void login() {
try {
Socket client = new Socket("192.168.2.100",7777);
ClientLoginThread clt = new ClientLoginThread(client);
clt.start();
clt.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class ClientLoginThread extends Thread{
private Socket client;
public ClientLoginThread(Socket client) {
this.client = client;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));
Scanner sc = new Scanner(System.in);
System.out.println("输入用户名:");
String username = sc.next();
System.out.println("输入密码:");
String password = sc.next();
String userinfo = username + "#" + password;
pw.println(userinfo);
pw.flush();
String msg = br.readLine();
System.out.println(msg);
pw.close();
br.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class ClientRegThread extends Thread {
private Socket client;
public ClientRegThread(Socket client) {
this.client = client;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));
Scanner sc = new Scanner(System.in);
System.out.println("输入用户名:");
String username = sc.next();
System.out.println("输入密码:");
String password = sc.next();
String userinfo = username + "#" + password;
pw.println(userinfo);
pw.flush();
String msg = br.readLine();
System.out.println(msg);
pw.close();
br.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class LoginThread extends Thread {
private Socket client;
private Properties userPros;
public LoginThread(Socket client, Properties userPros) {
super();
this.client = client;
this.userPros = userPros;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));
String user = br.readLine();
String[] users = user.split("#");
String username = users[0];
String password = users[1];
if (userPros.containsKey(username)) {
if (userPros.getProperty(username).equals(password)) {
pw.println("登录成功");
pw.flush();
} else {
pw.println("登录失败,密码错误");
pw.flush();
}
} else {
System.out.println("用户名不存在");
pw.flush();
}
pw.close();
br.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class RegThread extends Thread {
// 客户端
private Socket client;
// 配置文件
private Properties userPros;
public RegThread(Socket client, Properties userPros) {
this.client = client;
this.userPros = userPros;
}
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream(), "UTF-8"));
PrintWriter pw = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));
String user = br.readLine();
String[] users = user.split("#");
String username = users[0];
String password = users[1];
if (userPros.containsKey(username)) {
pw.println("用户名存在,重新注册");
pw.flush();
} else {
userPros.setProperty(username, password);
userPros.store(new FileWriter("userPros.propertise"), null);
pw.println("注册成功");
pw.flush();
}
pw.close();
br.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Server {
private Properties userPros;
public Server() {
userPros = new Properties();
File file = new File("userPros.propertise");
if (file.exists()) {
try {// 把文件内容加载入properties集合
userPros.load(new FileReader(file));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void registerUser() {
try {
ServerSocket server = new ServerSocket(9999);
System.out.println("注册线程已启动...");
while (true) {
Socket client = server.accept();
new RegThread(client, userPros).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void login() {
try {
ServerSocket server = new ServerSocket(7777);
System.out.println("登录线程启动");
while (true) {
Socket client = server.accept();
LoginThread lt = new LoginThread(client, userPros);
lt.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class StartMenu {
public static void main(String[] args) {
Client client = new Client();
System.out.println("欢迎进入系统");
Scanner sc = new Scanner(System.in);
int choice = 0;
do {
System.out.println("输入选择:1.注册 2.登录 0.退出");
choice = sc.nextInt();
switch (choice) {
case 1:
client.reg();
case 2:
client.login();
default:
break;
}
} while (choice != 0);
System.out.println("退出");
}
}
public class StartServer {
public static void main(String[] args) {
Server server = new Server();
new Thread() {
public void run() {
server.registerUser();
}
}.start();
new Thread() {
public void run() {
server.login();
}
}.start();
}
}
运行结果:
登录线程启动
注册线程已启动...
欢迎进入系统
输入选择:1.注册 2.登录 0.退出
1
输入用户名:
mike
输入密码:
123
注册成功
输入选择:1.注册 2.登录 0.退出
2
输入用户名:
mike
输入密码:
123
登录成功
输入选择:1.注册 2.登录 0.退出
0
退出
--------------------------------------------------------------------------
对象类
public class TestClassObject {
public static void main(String[] args) {
Student s = new Student();
// System.out.println(s.getClass());
Class c = s.getClass();
System.out.println(c.toString());
}
}
class Student {
String name;
int age;
String sex;
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public void study() { }
public void exam() { }
public void work() { }
}
运行结果:
class week07.day34.reflects.Student
--------------------------------------------------------------------------
获取对象类
public class TestGetClassObject {
public static void main(String[] args) {
// 1.通过类的对象获取类对象
Person p = new Person();// 类的对象
Class c = p.getClass();// 类对象
System.out.println(c.getName());
System.out.println("----------");
// 2.通过类名获取Class对象
Class c2 = Person.class;
System.out.println(c2.getName());
System.out.println("----------");
// 3.通过Class静态方法获取Class对象
try {
Class c3 = Class.forName("week07.day34.reflects.Person");
System.out.println(c3.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Person {
}
运行结果:
week07.day34.reflects.Person
----------
week07.day34.reflects.Person
----------
week07.day34.reflects.Person
--------------------------------------------------------------------------
对象类方法
public class TestClassMethods {
public static void main(String[] args)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class c = Class.forName("week07.day34.methods.Student");
System.out.println(c.getName());
System.out.println("-----");
// 获得指定类对象的包
Package pack = c.getPackage();
System.out.println(pack.getName());
System.out.println("-----");
// 获得父类Class对象
Class superClass = c.getSuperclass();
System.out.println(superClass.getName());
System.out.println("-----");
// 获得接口
Class[] interfaces = c.getInterfaces();
for (Class inter : interfaces) {
System.out.println(inter.getName());
}
System.out.println("-----");
// 获取属性(自身+父类公开属性)
Field[] fields = c.getFields();
for (Field f : fields) {
System.out.println(f.getName());
}
System.out.println("-----");
// 获取Class对象自身所有属性
Field[] fields2 = c.getDeclaredFields();
for (Field f : fields2) {
System.out.println(f.getName());
}
System.out.println("-----");
// 获取自身+父类所有公开方法
Method[] methods = c.getMethods();
for (Method m : methods) {
System.out.println(m.getName());
}
System.out.println("-----");
// 自身方法
Method[] methods2 = c.getDeclaredMethods();
for (Method m : methods2) {
System.out.println(m.getName() + ":" + m.getReturnType());
}
System.out.println("-----");
//
Constructor[] cs = c.getConstructors();
for (Constructor ct : cs) {
System.out.print(ct.getName() + ":");
Class[] param = ct.getParameterTypes();// 获得构造方法形参
for (Class p : param) {
System.out.println(p.getName());
}
}
System.out.println();
System.out.println("-----");
//
Object o = c.newInstance();
Student stu = (Student) o;
System.out.println(stu);
}
}
class Person {
public String sex;
public double money;
public void eat() {
}
public void sleep() {
}
}
class Student extends Person implements Serializable, Runnable, Comparable {
public String name;
public int age;
double score;
public Student() {
}
public Student(String name) {
this.name = name;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void exam() { }
public void play() { }
public int compareTo(Object o) {
return 0;
}
public void run() { }
}
运行结果:
week07.day34.methods.Student
-----
week07.day34.methods
-----
week07.day34.methods.Person
-----
java.io.Serializable
java.lang.Runnable
java.lang.Comparable
-----
name
age
sex
money
-----
name
age
score
-----
run
compareTo
play
exam
sleep
eat
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
-----
run:void
compareTo:int
play:void
exam:void
-----
week07.day34.methods.Student:java.lang.String
int
week07.day34.methods.Student:java.lang.String
week07.day34.methods.Student:
-----
week07.day34.methods.Student@55f96302
--------------------------------------------------------------------------
对象类——Instance
public class TestNewInstance {
public static void main(String[] args) throws Exception {
//1.直接new
Teacher t1 = new Teacher();
t1.name = "aaa";
System.out.println(t1.name);
System.out.println("-----");
//2.反射——通过类对象创建类的对象
Class c = Teacher.class;
Teacher t2 = (Teacher)c.newInstance();
t2.name="bbb";
System.out.println(t2.name);
System.out.println("-----");
//3.
Object o = objectCreate("week07.day34.methods.Teacher");
System.out.println(o);
}
//创建对象
//创建对象工厂
public static Object objectCreate(String className) {
try {
Class c = Class.forName(className);
return c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
class Teacher {
String name;
String sex;
Integer age;
public Teacher() {
}
public Teacher(String name, String sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public void study() {
System.out.println("我在学校");
}
public void exam() {
System.out.println("我在考试");
}
public void calc() {
System.out.println("我在算分");
}
}
运行结果:
aaa
-----
bbb
-----
week07.day34.methods.Teacher@6d06d69c
--------------------------------------------------------------------------
public class TestNewInstanceForFile {
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("application.txt");
BufferedReader br = new BufferedReader(fr);
String className = br.readLine();
Object o = objectCreate(className);
System.out.println(o);
}
//创建对象
//创建对象工厂
public static Object objectCreate(String className) {
try {
Class c = Class.forName(className);
return c.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
运行结果:
week07.day34.methods.Teacher@6d06d69c