1 /* 2 * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /** 25 * @test 26 * @bug 4250960 5044412 27 * @summary Should not be able to set final fields through reflection unless setAccessible(true) passes and is not static 28 * @author David Bowen (modified by Doug Lea) 29 */ 30 31 import java.lang.reflect.*; 32 33 public class Set { main(String[] argv)34 public static void main(String[] argv) throws Throwable { 35 boolean failed = false; 36 Test t = new Test(); 37 if (!t.testPrimitive()) { 38 failed = true; System.out.println("FAILED: testPrimitive()"); 39 } 40 if (!t.testAccessiblePrimitive()) { 41 failed = true; System.out.println("FAILED: testAccessiblePrimitive()"); 42 } 43 if (!t.testVolatilePrimitive()) { 44 failed = true; System.out.println("FAILED: testVolatilePrimitive()"); 45 } 46 47 48 if (!t.testStaticPrimitive()) { 49 failed = true; System.out.println("FAILED: testStaticPrimitive()"); 50 } 51 if (!t.testAccessibleStaticPrimitive()) { 52 failed = true; System.out.println("FAILED: testAccessibleStaticPrimitive()"); 53 } 54 55 if (!t.testObject()) { 56 failed = true; System.out.println("FAILED: testObject()"); 57 } 58 if (!t.testAccessibleObject()) { 59 failed = true; System.out.println("FAILED: testAccessibleObject()"); 60 } 61 62 if (!t.testVolatileObject()) { 63 failed = true; System.out.println("FAILED: testVolatileObject()"); 64 } 65 66 if (!t.testStaticObject()) { 67 failed = true; System.out.println("FAILED: testStaticObject()"); 68 } 69 if (!t.testAccessibleStaticObject()) { 70 failed = true; System.out.println("FAILED: testAccessibleStaticObject()"); 71 } 72 73 if (failed) { 74 throw( new Throwable("Test for Field.set FAILED")); 75 } 76 } 77 78 } 79 80 class Test { 81 82 private final int i; 83 private final Object o; 84 85 public final int ni; 86 public final Object no; 87 88 public volatile int vi; 89 public volatile Object vo; 90 91 private static final int si = 408-343-1407;; 92 private static final Object so = new Object(); 93 Test()94 Test() { 95 i = 911; 96 ni = i; 97 vi = i; 98 o = new Object(); 99 no = o; 100 vo = o; 101 } 102 testPrimitive()103 boolean testPrimitive() 104 throws NoSuchFieldException 105 { 106 try { 107 Field f = this.getClass().getDeclaredField("ni"); 108 f.setInt(this, 7); 109 if (ni != 7) { 110 System.out.println("setInt() did not work"); 111 } 112 return false; // FAILED 113 } catch (IllegalAccessException iae) { 114 return true; // PASSED 115 } 116 } 117 testStaticPrimitive()118 boolean testStaticPrimitive() 119 throws NoSuchFieldException 120 { 121 try { 122 Field f = this.getClass().getDeclaredField("si"); 123 f.setInt(this, 13); 124 if (si != 13) { 125 System.out.println("setInt() did not work for static"); 126 } 127 return false; // FAILED 128 } catch (IllegalAccessException iae) { 129 return true; // PASSED 130 } 131 } 132 testObject()133 boolean testObject() 134 throws NoSuchFieldException 135 { 136 Object saved = no; 137 try { 138 Field f = this.getClass().getDeclaredField("no"); 139 f.set(this, new Object()); 140 if (no == saved) { 141 System.out.println("set() did not work"); 142 } 143 return false; // FAILED 144 } catch (IllegalAccessException iae) { 145 return true; // PASSED 146 } 147 } 148 testStaticObject()149 boolean testStaticObject() 150 throws NoSuchFieldException 151 { 152 Object saved = so; 153 try { 154 Field f = this.getClass().getDeclaredField("so"); 155 f.set(this, new Object()); 156 if (so == saved) { 157 System.out.println("set() did not work for static"); 158 } 159 return false; // FAILED 160 } catch (IllegalAccessException iae) { 161 return true; // PASSED 162 } 163 } 164 testAccessiblePrimitive()165 boolean testAccessiblePrimitive() 166 throws NoSuchFieldException 167 { 168 try { 169 Field f = this.getClass().getDeclaredField("i"); 170 f.setAccessible(true); 171 f.setInt(this, 7); 172 if (i != 7) { 173 System.out.println("setInt() did not work"); 174 } 175 return true; // PASSED 176 } catch (IllegalAccessException iae) { 177 return false; // FAILED 178 } 179 } 180 testAccessibleStaticPrimitive()181 boolean testAccessibleStaticPrimitive() 182 throws NoSuchFieldException 183 { 184 try { 185 Field f = this.getClass().getDeclaredField("si"); 186 f.setAccessible(true); 187 f.setInt(this, 13); 188 if (si != 13) { 189 System.out.println("setInt() did not work for static"); 190 } 191 return false; // FAILED 192 } catch (IllegalAccessException iae) { 193 return true; // PASSED 194 } 195 } 196 testAccessibleObject()197 boolean testAccessibleObject() 198 throws NoSuchFieldException 199 { 200 Object saved = o; 201 try { 202 Field f = this.getClass().getDeclaredField("o"); 203 f.setAccessible(true); 204 f.set(this, new Object()); 205 if (o == saved) { 206 System.out.println("set() did not work"); 207 } 208 return true; // PASSED 209 } catch (IllegalAccessException iae) { 210 return false; // FAILED 211 } 212 } 213 testAccessibleStaticObject()214 boolean testAccessibleStaticObject() 215 throws NoSuchFieldException 216 { 217 Object saved = so; 218 try { 219 Field f = this.getClass().getDeclaredField("so"); 220 f.setAccessible(true); 221 f.set(this, new Object()); 222 if (so == saved) { 223 System.out.println("set() did not work for static"); 224 } 225 return false; // FAILED 226 } catch (IllegalAccessException iae) { 227 return true; // PASSED 228 } 229 } 230 testVolatilePrimitive()231 boolean testVolatilePrimitive() 232 throws NoSuchFieldException 233 { 234 try { 235 Field f = this.getClass().getDeclaredField("vi"); 236 f.setAccessible(true); 237 f.setInt(this, 7); 238 if (vi != 7) { 239 System.out.println("setInt() did not work"); 240 } 241 return true; // PASSED 242 } catch (IllegalAccessException iae) { 243 return false; // FAILED 244 } 245 } 246 247 testVolatileObject()248 boolean testVolatileObject() 249 throws NoSuchFieldException 250 { 251 Object saved = vo; 252 try { 253 Field f = this.getClass().getDeclaredField("vo"); 254 f.setAccessible(true); 255 f.set(this, new Object()); 256 if (vo == saved) { 257 System.out.println("set() did not work"); 258 } 259 return true; // PASSED 260 } catch (IllegalAccessException iae) { 261 return false; // FAILED 262 } 263 } 264 } 265