Always force constructors accessible during inflation
We now correctly throw an IllegalAccessException for non-public accesses, but we were relying on the old incorrect behavior during inflation. This CL forces constructors to be accessible so that we emulate the old behavior and don't crash. Where we were already doing this, the CL moves the setAccessible() call immediately after the getConstructor() call, since there's no point in calling it multiple times. Bug: 20810495 Change-Id: I63dfcb857e445f688080eea05e86ef22760ed49f
This commit is contained in:
@@ -2095,6 +2095,7 @@ public class Notification implements Parcelable
|
||||
|
||||
try {
|
||||
Constructor<? extends Style> constructor = styleClass.getConstructor();
|
||||
constructor.setAccessible(true);
|
||||
style = constructor.newInstance();
|
||||
style.restoreFromExtras(extras);
|
||||
} catch (Throwable t) {
|
||||
|
||||
@@ -376,6 +376,7 @@ abstract class GenericInflater<T, P extends GenericInflater.Parent> {
|
||||
Class clazz = mContext.getClassLoader().loadClass(
|
||||
prefix != null ? (prefix + name) : name);
|
||||
constructor = clazz.getConstructor(mConstructorSignature);
|
||||
constructor.setAccessible(true);
|
||||
sConstructorMap.put(name, constructor);
|
||||
}
|
||||
|
||||
|
||||
@@ -211,10 +211,10 @@ public class TransitionInflater {
|
||||
.asSubclass(expectedType);
|
||||
if (c != null) {
|
||||
constructor = c.getConstructor(sConstructorSignature);
|
||||
constructor.setAccessible(true);
|
||||
sConstructors.put(className, constructor);
|
||||
}
|
||||
}
|
||||
constructor.setAccessible(true);
|
||||
return constructor.newInstance(mContext, attrs);
|
||||
}
|
||||
} catch (InstantiationException e) {
|
||||
|
||||
@@ -590,6 +590,7 @@ public abstract class LayoutInflater {
|
||||
}
|
||||
}
|
||||
constructor = clazz.getConstructor(mConstructorSignature);
|
||||
constructor.setAccessible(true);
|
||||
sConstructorMap.put(name, constructor);
|
||||
} else {
|
||||
// If we have a filter, apply it to cached constructor
|
||||
@@ -615,7 +616,6 @@ public abstract class LayoutInflater {
|
||||
Object[] args = mConstructorArgs;
|
||||
args[1] = attrs;
|
||||
|
||||
constructor.setAccessible(true);
|
||||
final View view = constructor.newInstance(args);
|
||||
if (view instanceof ViewStub) {
|
||||
// Use the same context when inflating ViewStub later.
|
||||
|
||||
@@ -544,6 +544,7 @@ public class MenuInflater {
|
||||
try {
|
||||
Class<?> clazz = mContext.getClassLoader().loadClass(className);
|
||||
Constructor<?> constructor = clazz.getConstructor(constructorSignature);
|
||||
constructor.setAccessible(true);
|
||||
return (T) constructor.newInstance(arguments);
|
||||
} catch (Exception e) {
|
||||
Log.w(LOG_TAG, "Cannot instantiate class: " + className, e);
|
||||
|
||||
Reference in New Issue
Block a user