Android 反射方法调用R文件,解除包名依赖
2017-05-16 17:05
204 查看
如果是R.id 或者R.drawable ,可以通过 context.getResource().getIdentifier(name,"id",context.getPackageName()) 这种方式获得ID,
经过测试发现R.styleable R.attr 获取不到,这种情况可以通过反射的方法
/**
*
* @param context
* @param type
* @param name
* @return
*/
public static Object getResourceData(Context context, String type, String name) {
try {
Class<?> arrayClass = getResourceClass(context, type).getClass();
Field intField = arrayClass.getField(name);
return intField.get(arrayClass);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static HashMap<String, Object> ResourceClass = new HashMap<String, Object>();
private static Object getResourceClass(Context context, String type) {
if (ResourceClass.containsKey(type)) {
return ResourceClass.get(type);
} else {
try {
Class<?> resource = Class.forName(context.getPackageName() + ".R");
Class<?>[] classes = resource.getClasses();
for (Class<?> c : classes) {
int i = c.getModifiers();
String className = c.getName();
String s = Modifier.toString(i);
if (s.contains("static") && className.contains(type)) {
ResourceClass.put(type, c.getConstructor().newInstance());
return ResourceClass.get(type);
} else {
continue;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
这种方法兼容R文件里的所有内容,取出来之后类型强制转换一下就好了
(int[]) getResourceData(context, "styleable", "Setting")
(Integer) getResourceData(context, "id", "title")
经过测试发现R.styleable R.attr 获取不到,这种情况可以通过反射的方法
/**
*
* @param context
* @param type
* @param name
* @return
*/
public static Object getResourceData(Context context, String type, String name) {
try {
Class<?> arrayClass = getResourceClass(context, type).getClass();
Field intField = arrayClass.getField(name);
return intField.get(arrayClass);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static HashMap<String, Object> ResourceClass = new HashMap<String, Object>();
private static Object getResourceClass(Context context, String type) {
if (ResourceClass.containsKey(type)) {
return ResourceClass.get(type);
} else {
try {
Class<?> resource = Class.forName(context.getPackageName() + ".R");
Class<?>[] classes = resource.getClasses();
for (Class<?> c : classes) {
int i = c.getModifiers();
String className = c.getName();
String s = Modifier.toString(i);
if (s.contains("static") && className.contains(type)) {
ResourceClass.put(type, c.getConstructor().newInstance());
return ResourceClass.get(type);
} else {
continue;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
这种方法兼容R文件里的所有内容,取出来之后类型强制转换一下就好了
(int[]) getResourceData(context, "styleable", "Setting")
(Integer) getResourceData(context, "id", "title")
相关文章推荐
- C#实现反射调用动态加载的DLL文件中的方法
- Android获取其他包的Context实例,然后调用它的方法,反射!!!
- C#实现反射调用动态加载的DLL文件中的方法
- Android 反射调用方法并利用此方法展开android通知栏
- java反射调用配置文件构造类对象,使用其方法
- 编写一个文件,读取 src 下面day12包 下面的my.properties 文件,文件内容如下, className=day12.User 结合 IO、反射知识,完成 配置文件中对象的创建和方法调用。并编写方法,列举出 Student 类中所有的属性、
- android中使用反射机制,调用framework中的类和方法
- Android测试文件与调用getreadableDatabase()方法数据库创建
- Android反射出一个类中的其他类对象并调用其对应方法
- android 反射机制和反射调用方法
- 利用java反射解决 Android系统方法不能调用的情况
- Android 反射调用方法并利用此方法展开android通知栏(兼容4.2及以上)
- Android调用so文件(C代码库)方法详解
- Android获取其他包的Context,反射实现方法调用
- C#实现反射调用动态加载的DLL文件中的方法
- Android调用本机程序执行文件的方法
- C#实现反射调用动态加载的DLL文件中的方法
- Android 下调用so库文件的方法
- 【Android开发经验】利用反射机制,获取类的字段、方法、并实现简单调用
- Android 通过反射调用隐蔽方法forceStopPackage结束应用