一.通过反射破解和防止反射破解单例模式案例
1 public class User {
2
3 private String userName;
4 private static User user;
5
6 public String getUserName() {
7 return userName;
8 }
9
10 public void setUserName(String userName) {
11 this.userName = userName;
12 }
13
14 private User(String userName) {
15
16 // 2.这句话用于防止通过反射的方式调用该构造器创建对象
17 if (user != null) {
18 throw new RuntimeException("非法创建对象!");
19 }
20 this.userName = userName;
21 }
22
23 public static User getInstance(String userName) {
24 if (user == null) {
25 user = new User(userName);
26 }
27 return user;
28 }
29 }
30
31 class MyTest {
32
33 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
34 //1.通过反射破解单例模式
35 User user = User.getInstance("王");
36 System.out.println(user.getUserName());
37
38 Class c1 = Class.forName("ustc.wzh.User");
39 Constructor<User> constructor = User.class.getDeclaredConstructor(String.class);
40 constructor.setAccessible(true);
41 User user1 = constructor.newInstance("张");
42
43 System.out.println(user1.getUserName());
44 System.out.println(user.getUserName());
45 }
46 }