【问题标题】:Class.forName android NoClassDefFoundError -> ClassNotFoundExceptionClass.forName android NoClassDefFoundError -> ClassNotFoundException
【发布时间】:2013-08-17 16:39:41
【问题描述】:

我有程序,我使用下面的代码来加载类 android.media.RemoteControlClient android.media.RemoteControlClient.MetadataEditor **给出错误 android.media.MediaMetadataRetriever

每个类都加载,除了一个,只有一行给出错误,其他行正常

try{
        mRemoteControlClass=Class.forName("android.media.RemoteControlClient");   

        //this gives the error
        MetadataEditorC=Class.forName("android.media.RemoteControlClient.MetadataEditor");

        MediaMetadataRetrieverC=Class.forName("android.media.MediaMetadataRetriever");

        Log.e("RemoteControlClient", "Succesfully Set Metadata");
        }catch(Exception e){e.printStackTrace();
            Log.e("RemoteControlClient", "ERROR Set Metadata");}

这是堆栈跟踪

08-17 16:17:17.621: W/System.err(1771): java.lang.ClassNotFoundException: android.media.RemoteControlClient.MetadataEditor
08-17 16:17:17.621: W/System.err(1771):     at java.lang.Class.classForName(Native Method)
08-17 16:17:17.621: W/System.err(1771):     at java.lang.Class.forName(Class.java:217)
08-17 16:17:17.621: W/System.err(1771):     at com.SmoothApps.iSenseMusic.MyRemoteControlClient.updatemetadata(MyRemoteControlClient.java:94)
08-17 16:17:17.621: W/System.err(1771):     at com.SmoothApps.iSenseMusic.iSenseMusic.setNotify(iSenseMusic.java:296)
08-17 16:17:17.621: W/System.err(1771):     at com.SmoothApps.iSenseMusic.iSenseMusic.onStartCommand(iSenseMusic.java:421)
08-17 16:17:17.621: W/System.err(1771):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2656)
08-17 16:17:17.621: W/System.err(1771):     at android.app.ActivityThread.access$1900(ActivityThread.java:141)
08-17 16:17:17.621: W/System.err(1771):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331)
08-17 16:17:17.621: W/System.err(1771):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-17 16:17:17.621: W/System.err(1771):     at android.os.Looper.loop(Looper.java:137)
08-17 16:17:17.621: W/System.err(1771):     at android.app.ActivityThread.main(ActivityThread.java:5039)
08-17 16:17:17.621: W/System.err(1771):     at java.lang.reflect.Method.invokeNative(Native Method)
08-17 16:17:17.621: W/System.err(1771):     at java.lang.reflect.Method.invoke(Method.java:511)
08-17 16:17:17.621: W/System.err(1771):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-17 16:17:17.621: W/System.err(1771):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-17 16:17:17.621: W/System.err(1771):     at dalvik.system.NativeStart.main(Native Method)
08-17 16:17:17.621: W/System.err(1771): Caused by: java.lang.NoClassDefFoundError: android/media/RemoteControlClient/MetadataEditor
08-17 16:17:17.621: W/System.err(1771):     ... 16 more
08-17 16:17:17.621: W/System.err(1771): Caused by: java.lang.ClassNotFoundException: android.media.RemoteControlClient.MetadataEditor
08-17 16:17:17.621: W/System.err(1771):     at java.lang.VMClassLoader.loadClass(Native Method)
08-17 16:17:17.621: W/System.err(1771):     at java.lang.BootClassLoader.findClass(ClassLoader.java:765)
08-17 16:17:17.621: W/System.err(1771):     at java.lang.BootClassLoader.loadClass(ClassLoader.java:825)
08-17 16:17:17.621: W/System.err(1771):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
08-17 16:17:17.621: W/System.err(1771):     ... 16 more
08-17 16:17:17.621: W/System.err(1771): Caused by: java.lang.NoClassDefFoundError: [generic]
08-17 16:17:17.621: W/System.err(1771):     ... 1 more

如果我尝试不同的方法然后一切正常,但它不是理想的编码或 cpu 友好,我必须加载超类的所有子类,然后检查名称,它就像我在下面编码的那样工作(我不'不知道为什么我上面使用的简单过程不起作用)

Class[] cls=mRemoteControlClass.getDeclaredClasses();
            for(int i=0;i<cls.length;i++){
                //Log.e("CLASS "+(i+1),cls[i].getName());
                if(cls[i].getName().contains("MetadataEditor"))
                MetadataEditorC=cls[i];
            }

我能猜到的是 thenclass MetaDataEditor 没有类定义,因此无法加载。但是通过其他方法我可以加载它。

我希望有一些简单的加载类的方法,我对java类加载不是很熟悉,请帮助。

【问题讨论】:

    标签: java android class reflection


    【解决方案1】:

    试试这个符号(见$):

    MetadataEditorC=Class.forName(
            "android.media.RemoteControlClient$MetadataEditor");
    

    这通常用于对内部类的引用。

    【讨论】:

    • 在您回答后我再次尝试时它起作用了。我不知道为什么我之前尝试过它不起作用(我可能犯了一些错误)。感谢您的快速回复,这很棒。谢谢楼主
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2013-03-04
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多