Java通过反射破解单例模式和防止反射破解单例模式案例

 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 }