客户端和服务端是两个大项目,但是客户端需要连接上服务端。
右键客户端的项目--Build path--Configure Build path--projects--add--选择要添加的项目
全类名:右键类名--Copy Qualified Name
简单工厂模式:帮助我们创建符合要求的对象。
工厂要生产合格的产品。
- 产品规范:接口、抽象类
- 产品:实现产品规范
- 工厂:生产产品
- 客户:练习工厂生产产品
反射
// 3种方法获取字节码(Class)对象
// 根据对象获取
User user = new User();
Class extends User> class1 = user.getClass();
// 根据类获取
Class class2 = User.class;
// 根据全类名(包名+类名)获取
Class> class3 = Class.forName("entity.User");
System.out.println(class1);
System.out.println(class2);
System.out.println(class3);
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
// 使用反射创建类的对象
public class Demo01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// 获取字节码对象
Class> class1 = Class.forName("entity.User");
// 获取构造方法
// 获取所有非私有的构造
// Constructor>[] constructors = class1.getConstructors();
// for (Constructor> constructor : constructors) {
// System.out.println(constructor);
// }
// 获取所有该类中声明的构造(包括私有)
// Constructor>[] constructors = class1.getDeclaredConstructors();
// for (Constructor> constructor : constructors) {
// System.out.println(constructor);
// }
// 根据构造的参数类型列表,来获取指定构造
Constructor> constructor1 = class1.getConstructor();// 无参构造
Constructor> constructor2 = class1.getConstructor(String.class);// 带字符串参数的公共构造
Constructor> constructor3 = class1.getDeclaredConstructor(String.class, String.class);// 带两个字符串参数的私有方法
System.out.println(constructor1);
System.out.println(constructor2);
System.out.println(constructor3);
// 创建对象
Object newInstance1 = constructor1.newInstance();
Object newInstance2 = constructor2.newInstance("admin");
// 暴力反射(私有的创建了对象也无法访问)
constructor3.setAccessible(true);
Object newInstance3 = constructor3.newInstance("admin", "123456");
}
}
import java.lang.reflect.Method;
public class Demo01 {
public static void main(String[] args) throws Exception {
// 获取字节码对象
Class> class1 = Class.forName("entity.User");
// 获取方法
// 获取所有-非私有-的方法(包含继承来的方法)
// Method[] methods = class1.getMethods();
// 获取所有-该类中-的方法(包含私有的)
// Method[] methods = class1.getDeclaredMethods();
// for (Method method : methods) {
// System.out.println(method);
// }
// public java.lang.String entity.User.getUsername()
Method method = class1.getMethod("getUsername");
System.out.println(method);
// public void entity.User.setUsername(java.lang.String)
Method method2 = class1.getMethod("setUsername", String.class);
System.out.println(method2);
// p1:调用该方法的对象
// p2:调用该方法时传入的参数
// Java快速通过字节码对象直接创建无参方法的对象
Object obj = class1.newInstance();
// 如果调用没有返回值的方法,返回的是null
Object invoke = method2.invoke(obj, "小明");
System.out.println(invoke);
// 如果调用的有返回值的方法,返回的是对应的返回值
Object invoke2 = method.invoke(obj);
System.out.println(invoke2);
}
}
// 上边反射要使用的类
public class User {
private String username;
public String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
private String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
System.out.println("无参构造");
}
private User(String username, String password) {
this.username = username;
this.password = password;
System.out.println("有参构造");
}
public User(String username) {
this(username, null);
}
}
properties:雷同键值对(key-value)
主要用于读取Java的配置文件。
// 先创建properties文件
# 服务端端口
server.port=6666
#文件信息
server.File=XML/fileInfos.xml
#用户信息
server.user=XML/users.xml
#服务信息
server.server=XML/servers.xml
// 使用properties文件步骤
import java.io.FileInputStream;
import java.util.Properties;
public class properties {
public static String get(String key) throws Exception {
// 创建文件
Properties prop = new Properties();
// 读取文件
prop.load(new FileInputStream("XML/config.properties"));
// 根据键取值
return prop.getProperty(key);
}
public static int getInt(String key) throws Exception {
return Integer.parseInt(get(key));
}
}
魔法值
主要用于赋值常量,改的时候改一处即可。(首先创造一个常量类,然后调用)
public class constains {
// 内部静态常量类(服务类)
public static class server {
public static final String START = "start";
public static final String LOGIN = "login";
public static final String REGISTER = "register";
public static final String GET_FILE_LIST = "getFile";
public static final String DOWNLOAD = "download";
}
}
分层优化思想(DAO层)
优化主要代码:否则代码中的主要代码(处理业务)偏少,判断或其他代码太多。
API知识点:
集合转数组:集合名.toArray(new int[] {}) --------- 括号里只是表示转成什么类型的数组



