2012-01-31 33 views
0

删除应用程序数据我想使用反射,但在调用时获得NPE方法NPE时的方法

Class<?> myClass = Class.forName("android.content.pm.IPackageManager"); 
Method method = myClass.getMethod("clearApplicationUserData", String.class,IPackageDataObserver.class); 
method.setAccessible(true); 
Log.v("info",method.getName()); 
Object c = myClass .newInstance(); 
method.invoke(c,"com.example.android.apis",null); //NPE 

clearApplicationUserData任何回报,并采取两个参数StringIPackageDataObserver

我是否传递正确的参数?

或者我该如何解决问题?

调试时的StackTrace。

01-31 17:50:07.125: V/info(969): clearApplicationUserData 
01-31 17:50:26.305: D/dalvikvm(969): newInstance failed: p0 i1 [0 a1 
01-31 17:50:26.305: W/System.err(969): java.lang.InstantiationException: android.content.pm.IPackageManager 
01-31 17:50:26.305: W/System.err(969):  at java.lang.Class.newInstanceImpl(Native Method) 
01-31 17:50:26.315: W/System.err(969):  at java.lang.Class.newInstance(Class.java:1479) 
01-31 17:50:26.325: W/System.err(969):  at f.c.v.ClearUserDataUsingInterfaceActivity.onCreate(ClearUserDataUsingInterfaceActivity.java:52) 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-31 17:50:26.355: W/System.err(969): at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
01-31 17:50:26.355: W/System.err(969): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
01-31 17:50:26.365: W/System.err(969): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
01-31 17:50:26.365: W/System.err(969): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
01-31 17:50:26.375: W/System.err(969): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-31 17:50:26.375: W/System.err(969): at android.os.Looper.loop(Looper.java:123) 
01-31 17:50:26.385: W/System.err(969): at android.app.ActivityThread.main(ActivityThread.java:4363) 
01-31 17:50:26.385: W/System.err(969): at java.lang.reflect.Method.invokeNative(Native Method) 
01-31 17:50:26.395: W/System.err(969): at java.lang.reflect.Method.invoke(Method.java:521) 
01-31 17:50:26.395: W/System.err(969): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
01-31 17:50:26.405: W/System.err(969): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

01-31 17:50:26.405:W/System.err的(969):在dalvik.system.NativeStart.main(本机方法)

和全堆栈跟踪。

01-31 17:26:38.285: E/AndroidRuntime(920): Uncaught handler: thread main exiting due to uncaught exception 
01-31 17:26:38.295: E/AndroidRuntime(920): java.lang.RuntimeException: Unable to start activity ComponentInfo{f.c.v/f.c.v.ClearUserDataUsingInterfaceActivity}: java.lang.NullPointerException 
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
01-31 17:26:38.295: E/AndroidRuntime(920): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
01-31 17:26:38.295: E/AndroidRuntime(920): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
01-31 17:26:38.295: E/AndroidRuntime(920): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
01-31 17:26:38.295: E/AndroidRuntime(920): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-31 17:26:38.295: E/AndroidRuntime(920): at android.os.Looper.loop(Looper.java:123) 
01-31 17:26:38.295: E/AndroidRuntime(920): at android.app.ActivityThread.main(ActivityThread.java:4363) 
01-31 17:26:38.295: E/AndroidRuntime(920): at java.lang.reflect.Method.invokeNative(Native Method) 
01-31 17:26:38.295: E/AndroidRuntime(920): at java.lang.reflect.Method.invoke(Method.java:521) 
01-31 17:26:38.295: E/AndroidRuntime(920): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
01-31 17:26:38.295: E/AndroidRuntime(920): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
01-31 17:26:38.295: E/AndroidRuntime(920): at dalvik.system.NativeStart.main(Native Method) 
01-31 17:26:38.295: E/AndroidRuntime(920): Caused by: java.lang.NullPointerException 
01-31 17:26:38.295: E/AndroidRuntime(920): at java.lang.reflect.Method.invokeNative(Native Method) 
1-31 17:26:38.295: E/AndroidRuntime(920): at java.lang.reflect.Method.invoke(Method.java:521) 
01-31 17:26:38.295: E/AndroidRuntime(920): at f.c.v.ClearUserDataUsingInterfaceActivity.onCreate(ClearUserDataUsingInterfaceActivity.java:57) 
01-31 17:26:38.295: E/AndroidRuntime(920): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-31 17:26:38.295: E/AndroidRuntime(920): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
01-31 17:26:38.295: E/AndroidRuntime(920): ... 11 more 
+0

什么是'deleteClass'?向我们展示堆栈跟踪。 – 2012-01-31 12:11:34

+0

抱歉更新了帖子。 – 2012-01-31 12:13:09

+0

告诉我们堆栈跟踪。 NPE是否被抛入'clearApplicationUserData'内?它很可能不支持null作为参数。 – 2012-01-31 12:20:06

回答

1

IPackageManager是一个接口(如'I'前缀所示)。你不能通过反射来实例化一个接口。

我猜你的意思是android.content.pm.PackageManager

+0

如果我改变method.invoke(MyClass的, “com.example.android.apis”,新IPackageDataObserver.Stub(){ \t \t \t \t \t \t \t \t \t \t \t \t \t \t公共无效onRemoveCompleted(字符串的packageName ,布尔成功) \t \t \t \t \t \t \t \t \t将抛出RemoteException { \t \t \t \t \t \t \t \t日志。V( “信息”, “sucess”); \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t} \t \t \t \t \t \t});那么我得到异常,'对象不是类的一个实例' – 2012-01-31 12:37:05

+0

你应该改变'Class myClass = Class.forName(“android.content.pm.IPackageManager”);'因为IPackageManager是一个接口。查看http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#newInstance(),你会看到为什么你会得到instantiationException。 – asenovm 2012-01-31 12:39:39

+0

如何通过实例化一个实现IPackageManager接口的类来访问IPackageMnager.aidl – 2012-01-31 12:44:36

0
  1. 好像你应该调用myClass.newInstance(),而不是deleteClass.newInstance()
  2. 确保clearApplicationUserData()方法知道处理空值IPackageDataObserver。

希望它有帮助。

0

什么是deleteClass?你不应该试图在myClass上调用你的方法吗?

+0

对不起更新了帖子。 – 2012-01-31 12:13:34