Blame view

java110-service/src/main/java/com/java110/service/smo/impl/DefaultMemberAccess.java 3.82 KB
88e030b7   王彪总   init project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  package com.java110.service.smo.impl;
  
  import org.apache.ibatis.ognl.MemberAccess;
  
  import java.lang.reflect.AccessibleObject;
  import java.lang.reflect.Member;
  import java.lang.reflect.Modifier;
  import java.util.Map;
  
  /**
   * This class provides methods for setting up and restoring
   * access in a Field.  Java 2 provides access utilities for setting
   * and getting fields that are non-public.  This object provides
   * coarse-grained access controls to allow access to private, protected
   * and package protected members.  This will apply to all classes
   * and members.
   *
   * @author Luke Blanshard (blanshlu@netscape.net)
   * @author Drew Davidson (drew@ognl.org)
   * @version 15 October 1999
   */
  public class DefaultMemberAccess implements MemberAccess {
      public boolean allowPrivateAccess = false;
      public boolean allowProtectedAccess = false;
      public boolean allowPackageProtectedAccess = false;
  
      /*===================================================================
          Constructors
        ===================================================================*/
      public DefaultMemberAccess(boolean allowAllAccess) {
          this(allowAllAccess, allowAllAccess, allowAllAccess);
      }
  
      public DefaultMemberAccess(boolean allowPrivateAccess, boolean allowProtectedAccess, boolean allowPackageProtectedAccess) {
          super();
          this.allowPrivateAccess = allowPrivateAccess;
          this.allowProtectedAccess = allowProtectedAccess;
          this.allowPackageProtectedAccess = allowPackageProtectedAccess;
      }
  
      /*===================================================================
          Public methods
        ===================================================================*/
      public boolean getAllowPrivateAccess() {
          return allowPrivateAccess;
      }
  
      public void setAllowPrivateAccess(boolean value) {
          allowPrivateAccess = value;
      }
  
      public boolean getAllowProtectedAccess() {
          return allowProtectedAccess;
      }
  
      public void setAllowProtectedAccess(boolean value) {
          allowProtectedAccess = value;
      }
  
      public boolean getAllowPackageProtectedAccess() {
          return allowPackageProtectedAccess;
      }
  
      public void setAllowPackageProtectedAccess(boolean value) {
          allowPackageProtectedAccess = value;
      }
  
      /*===================================================================
          MemberAccess interface
        ===================================================================*/
      public Object setup(Map context, Object target, Member member, String propertyName) {
          Object result = null;
  
          if (isAccessible(context, target, member, propertyName)) {
              AccessibleObject accessible = (AccessibleObject) member;
  
              if (!accessible.isAccessible()) {
                  result = Boolean.FALSE;
                  accessible.setAccessible(true);
              }
          }
          return result;
      }
  
      public void restore(Map context, Object target, Member member, String propertyName, Object state) {
          if (state != null) {
              ((AccessibleObject) member).setAccessible(((Boolean) state).booleanValue());
          }
      }
  
      /**
       * Returns true if the given member is accessible or can be made accessible
       * by this object.
       */
      public boolean isAccessible(Map context, Object target, Member member, String propertyName) {
          int modifiers = member.getModifiers();
          boolean result = Modifier.isPublic(modifiers);
  
          if (!result) {
              if (Modifier.isPrivate(modifiers)) {
                  result = getAllowPrivateAccess();
              } else {
                  if (Modifier.isProtected(modifiers)) {
                      result = getAllowProtectedAccess();
                  } else {
                      result = getAllowPackageProtectedAccess();
                  }
              }
          }
          return result;
      }
  
  }