169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* 269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit. 369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved. 469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version 669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with 769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License. Alternatively, the contents of this file may be used under 869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later. 969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis, 1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the 1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License. 1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist.util.proxy; 1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.lang.reflect.AccessibleObject; 1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.lang.reflect.Constructor; 1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.lang.reflect.Field; 2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.lang.reflect.Method; 2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.security.AccessController; 2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.security.PrivilegedAction; 2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.security.PrivilegedActionException; 2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.security.PrivilegedExceptionAction; 2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalclass SecurityActions { 2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static Method[] getDeclaredMethods(final Class clazz) { 2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (System.getSecurityManager() == null) 2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clazz.getDeclaredMethods(); 3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (Method[]) AccessController 3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal .doPrivileged(new PrivilegedAction() { 3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object run() { 3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clazz.getDeclaredMethods(); 3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal }); 3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static Constructor[] getDeclaredConstructors(final Class clazz) { 4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (System.getSecurityManager() == null) 4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clazz.getDeclaredConstructors(); 4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (Constructor[]) AccessController 4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal .doPrivileged(new PrivilegedAction() { 4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object run() { 4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clazz.getDeclaredConstructors(); 4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal }); 5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static Method getDeclaredMethod(final Class clazz, final String name, 5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal final Class[] types) throws NoSuchMethodException { 5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (System.getSecurityManager() == null) 5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clazz.getDeclaredMethod(name, types); 5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (Method) AccessController 6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal .doPrivileged(new PrivilegedExceptionAction() { 6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object run() throws Exception { 6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clazz.getDeclaredMethod(name, types); 6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal }); 6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (PrivilegedActionException e) { 6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (e.getCause() instanceof NoSuchMethodException) 6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw (NoSuchMethodException) e.getCause(); 6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException(e.getCause()); 7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static Constructor getDeclaredConstructor(final Class clazz, 7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal final Class[] types) 7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws NoSuchMethodException 7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (System.getSecurityManager() == null) 8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clazz.getDeclaredConstructor(types); 8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return (Constructor) AccessController 8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal .doPrivileged(new PrivilegedExceptionAction() { 8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object run() throws Exception { 8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return clazz.getDeclaredConstructor(types); 8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal }); 8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (PrivilegedActionException e) { 9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (e.getCause() instanceof NoSuchMethodException) 9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw (NoSuchMethodException) e.getCause(); 9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException(e.getCause()); 9569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static void setAccessible(final AccessibleObject ao, 10069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal final boolean accessible) { 10169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (System.getSecurityManager() == null) 10269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ao.setAccessible(accessible); 10369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 10469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AccessController.doPrivileged(new PrivilegedAction() { 10569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object run() { 10669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal ao.setAccessible(accessible); 10769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 10869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 10969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal }); 11069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 11169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 11269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 11369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal static void set(final Field fld, final Object target, final Object value) 11469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throws IllegalAccessException 11569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 11669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (System.getSecurityManager() == null) 11769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal fld.set(target, value); 11869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else { 11969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal try { 12069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal AccessController.doPrivileged(new PrivilegedExceptionAction() { 12169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public Object run() throws Exception { 12269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal fld.set(target, value); 12369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 12469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 12569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal }); 12669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 12769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal catch (PrivilegedActionException e) { 12869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (e.getCause() instanceof NoSuchMethodException) 12969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw (IllegalAccessException) e.getCause(); 13069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 13169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal throw new RuntimeException(e.getCause()); 13269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 13369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 13469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 13569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal} 136