ADD week 5
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package androidx.fragment.app;
|
||||
|
||||
import androidx.collection.SimpleArrayMap;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
/* loaded from: classes.dex */
|
||||
public class FragmentFactory {
|
||||
private static final SimpleArrayMap<ClassLoader, SimpleArrayMap<String, Class<?>>> sClassCacheMap = new SimpleArrayMap<>();
|
||||
|
||||
private static Class<?> loadClass(ClassLoader classLoader, String str) throws ClassNotFoundException {
|
||||
SimpleArrayMap<ClassLoader, SimpleArrayMap<String, Class<?>>> simpleArrayMap = sClassCacheMap;
|
||||
SimpleArrayMap<String, Class<?>> simpleArrayMap2 = simpleArrayMap.get(classLoader);
|
||||
if (simpleArrayMap2 == null) {
|
||||
simpleArrayMap2 = new SimpleArrayMap<>();
|
||||
simpleArrayMap.put(classLoader, simpleArrayMap2);
|
||||
}
|
||||
Class<?> cls = simpleArrayMap2.get(str);
|
||||
if (cls != null) {
|
||||
return cls;
|
||||
}
|
||||
Class<?> cls2 = Class.forName(str, false, classLoader);
|
||||
simpleArrayMap2.put(str, cls2);
|
||||
return cls2;
|
||||
}
|
||||
|
||||
static boolean isFragmentClass(ClassLoader classLoader, String str) {
|
||||
try {
|
||||
return Fragment.class.isAssignableFrom(loadClass(classLoader, str));
|
||||
} catch (ClassNotFoundException unused) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static Class<? extends Fragment> loadFragmentClass(ClassLoader classLoader, String str) {
|
||||
try {
|
||||
return loadClass(classLoader, str);
|
||||
} catch (ClassCastException e) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": make sure class is a valid subclass of Fragment", e);
|
||||
} catch (ClassNotFoundException e2) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": make sure class name exists", e2);
|
||||
}
|
||||
}
|
||||
|
||||
public Fragment instantiate(ClassLoader classLoader, String str) {
|
||||
try {
|
||||
return loadFragmentClass(classLoader, str).getConstructor(new Class[0]).newInstance(new Object[0]);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": make sure class name exists, is public, and has an empty constructor that is public", e);
|
||||
} catch (InstantiationException e2) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": make sure class name exists, is public, and has an empty constructor that is public", e2);
|
||||
} catch (NoSuchMethodException e3) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": could not find Fragment constructor", e3);
|
||||
} catch (InvocationTargetException e4) {
|
||||
throw new Fragment.InstantiationException("Unable to instantiate fragment " + str + ": calling Fragment constructor caused an exception", e4);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user