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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM