GVKun编程网logo

跨ClassLoader的Java 8 ScriptEngine(java跨类调用)

9

这篇文章主要围绕跨ClassLoader的Java8ScriptEngine和java跨类调用展开,旨在为您提供一份详细的参考资料。我们将全面介绍跨ClassLoader的Java8ScriptEng

这篇文章主要围绕跨ClassLoader的Java 8 ScriptEnginejava跨类调用展开,旨在为您提供一份详细的参考资料。我们将全面介绍跨ClassLoader的Java 8 ScriptEngine的优缺点,解答java跨类调用的相关问题,同时也会为您带来android – dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)中的类加载错误?、ClassLoader.loadClass() throws java.lang.ClassNotFoundException、com.intellij.lang.javascript.JavaScriptSupportLoader的实例源码、dalvik.system.BaseDexClassLoader.findClass中的java.lang.ClassNotFoundException的实用方法。

本文目录一览:

跨ClassLoader的Java 8 ScriptEngine(java跨类调用)

跨ClassLoader的Java 8 ScriptEngine(java跨类调用)

我需要在不同的类加载器内部执行一些javascript代码。如果是Java,则每个任务将在单独的类加载器中运行。现在,我需要使用JavaScript。

我需要ScriptEngine在每个类加载器中创建的新实例,还是可以在类加载器之间共享一个实例?

答案1

小编典典

从您的问题尚不清楚,您为什么要寻找这样的类加载器隔离。因此,我在这里总结nashorn的类加载器-也许,您会找到想要的东西。

Nashorn和类加载器:

  1. Nashorn类(jdk.nashorn。*)由Java扩展类加载器加载
  2. 生成的脚本类,适配器(子类,脚本的接口实现)由nashorn的内部类加载器加载。
  3. 从脚本引用的Java类由Nashorn的“应用类加载器”加载。

(1)和(2)无法自定义。nashorn代码中假设它是特权代码。并且有关于通用脚本类加载器和适配器加载器的假设。

(3)默认是创建nashorn引擎时的线程上下文类加载器。如果线程上下文类加载器为null,则使用Nashorn自己的加载器(扩展加载器)。

因此,如果在通过Thread.setContextClassLoader
API设置了合适的线程上下文加载器之后创建了Nashorn引擎,则可以控制脚本引擎的“应用程序类加载器”。

如果可以使用NashornScriptEngineFactory(特定于nashorn的API
https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html)创建脚本引擎,您也可以通过编程方式将任何类加载器作为“应用类加载器”传递。您可能要签出接受ClassLoader参数的NashornScriptEngineFactory方法。

除了“应用程序类加载器”外,您还可以选择在“应用程序类加载器”之前搜索其他附加的类加载器。这由“ -cp”或“ -classpath”
nashorn命令行选项指定。请注意,您可以通过“
nashorn.args”系统属性为脚本引擎指定nashorn命令行选项,也可以使用NashornScriptEngineFactory类的getScriptEngine方法以编程方式传递。另请参阅:https
:
//wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes

希望这可以帮助。

android – dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)中的类加载错误?

android – dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)中的类加载错误?

无法运行以下项目,项目中没有错误.我已经多次运行该项目了.请有人帮我解决问题.

AndroidManifest.xml中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.extremefitness.org"
    android:versionCode="1"
    android:versionName="1.0" >

    <supports-screens
        android:anyDensity="false"
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    <uses-permission android:name="android.permission.CLEAR_APP_CACHE" >
    </uses-permission>
    <uses-permission android:name="android.permission.disABLE_KEyguard" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".Tabbaractivity"
            android:windowSoftInputMode="adjustPan|adjustResize" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".HomeActivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.LoginActivity"
            android:noHistory="true"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.Registeractivity"
            android:noHistory="true"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.Profiletabactivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.RandomWorkouttabactivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.Tracktabactivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.Workouttabactivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.StatsActivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.ExerciseActivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.CustomDialog"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.WorkoutDescription"
            android:noHistory="true"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.ExerciseDescription"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.Settings"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>

        <activity
            android:name="com.extremefitness.views.RandomWorkoutResponse"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name=".FBActivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name=".Twitteractivity"
            android:screenorientation="portrait"
            android:windowSoftInputMode="adjustPan|adjustResize" >
        </activity>
        <activity
            android:name="com.extremefitness.views.VideoDialog"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:screenorientation="nosensor" >
            <Meta-data
                android:name="@string/minVersion"
                android:value="8" />
            <Meta-data
                android:name="@string/isLaunchableActivity"
                android:value="true" />
        </activity>
        <activity
            android:name="com.extremefitness.views.WorktVideoDialog"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:screenorientation="nosensor" >
            <Meta-data
                android:name="@string/minVersion"
                android:value="8" />
            <Meta-data
                android:name="@string/isLaunchableActivity"
                android:value="true" />
        </activity>
    </application>

</manifest>

错误的日志:

04-26 14:45:08.211: E/AndroidRuntime(2179): FATAL EXCEPTION: main
04-26 14:45:08.211: E/AndroidRuntime(2179): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.extremefitness.org/com.extremefitness.org.Tabbaractivity}: java.lang.classNotFoundException: com.extremefitness.org.Tabbaractivity
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1894)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.app.ActivityThread.access$600(ActivityThread.java:128)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.os.Looper.loop(Looper.java:137)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.app.ActivityThread.main(ActivityThread.java:4517)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at java.lang.reflect.Method.invokeNative(Native Method)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at java.lang.reflect.Method.invoke(Method.java:511)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at dalvik.system.NativeStart.main(Native Method)
04-26 14:45:08.211: E/AndroidRuntime(2179): Caused by: java.lang.classNotFoundException: com.extremefitness.org.Tabbaractivity
04-26 14:45:08.211: E/AndroidRuntime(2179):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at java.lang.classLoader.loadClass(ClassLoader.java:501)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at java.lang.classLoader.loadClass(ClassLoader.java:461)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.app.Instrumentation.newActivity(Instrumentation.java:1027)
04-26 14:45:08.211: E/AndroidRuntime(2179):     at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:1885)
04-26 14:45:08.211: E/AndroidRuntime(2179):     ... 11 more

解决方法

我遇到同样的问题,检查构建路径,你的第三个罐子没有在你的apk文件中. 1.右键单击您的项目,选择“构建路径” – > “配置构建路径…”. 2.在“订购和导出”选项卡中,选中“Android私有库”选项. 希望工作.

ClassLoader.loadClass() throws java.lang.ClassNotFoundException

ClassLoader.loadClass() throws java.lang.ClassNotFoundException

   
[python] view plain copy
  • root exception is java.rmi.MarshalException:error marshalling arguments:nested exception  

  •  

    今天写一个 RMI 的应用,气死人了,弄半天,跑到 sun 官网去一看,告诉我是一个 BUG, 我流出了鼻血。

     

    [java] view plain copy
  • Exception in thread "main" java.lang.ClassNotFoundException: [Ljava.lang.String;  
  •         at java.net.URLClassLoader$1.run(URLClassLoader.java:200)  
  •         at java.security.AccessController.doPrivileged(Native Method)  
  •         at java.net.URLClassLoader.findClass(URLClassLoader.java:188)  
  •         at java.lang.ClassLoader.loadClass(ClassLoader.java:306)  
  •         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)  
  •         at java.lang.ClassLoader.loadClass(ClassLoader.java:251)  
  •         at test.main(test.java:7)  

  • ToWork:

    -Dsun.lang.ClassLoader.allowArraySyntax=true

    点击打开链接


    原文链接: http://blog.csdn.net/chengchanglun/article/details/7441034

    com.intellij.lang.javascript.JavaScriptSupportLoader的实例源码

    com.intellij.lang.javascript.JavaScriptSupportLoader的实例源码

    项目:consulo-javascript    文件:JSResolveUtil.java   
    public static String findPackageForMxml(final PsiElement expression)
    {
        String s = null;
        final PsiFile containingFile = expression.getContainingFile();
    
        if(containingFile.getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4 && containingFile.getContext() != null)
        {
            final PsiFile contextContainigFile = containingFile.getContext().getContainingFile();
            VirtualFile file = contextContainigFile.getVirtualFile();
            if(file == null && contextContainigFile.getoriginalFile() != null)
            {
                file = contextContainigFile.getoriginalFile().getVirtualFile();
            }
    
            s = getExpectedPackageNameFromFile(file,containingFile.getProject(),true);
        }
        return s;
    }
    
    项目:consulo-javascript    文件:JSResolveUtil.java   
    public static JSClass getClassFromTagNameInMxml(final PsiElement psiElement)
    {
        XmlTag tag = psiElement != null ? PsiTreeUtil.getNonStrictParentOfType(psiElement,XmlTag.class) : null;
        if(tag != null && (tag.getNamespacePrefix().length() > 0 || JavaScriptSupportLoader.isFlexMxmFile(tag.getContainingFile())))
        {
            if(isScriptContextTag(tag))
            {
                tag = ((XmlFile) tag.getContainingFile()).getDocument().getRoottag();
            }
            final XmlElementDescriptor descriptor = tag.getDescriptor();
    
            if(descriptor != null)
            {
                PsiElement decl = descriptor.getDeclaration();
                if(decl instanceof JSClass)
                {
                    return ((JSClass) decl);
                }
                else if(decl instanceof XmlFile)
                {
                    return XmlBackedJSClassImpl.getXmlBackedClass((XmlFile) decl);
                }
            }
        }
        return null;
    }
    
    项目:consulo-javascript    文件:XmlBackedJSClassImpl.java   
    public static String findScriptNs(XmlTag roottag)
    {
        String ns = roottag.getNamespace();
        if(JavaScriptSupportLoader.isFlexMxmFile(roottag.getContainingFile()))
        {
            ns = "";
            for(String testNs : JavaScriptSupportLoader.MXML_URIS)
            {
                if(roottag.getPrefixByNamespace(testNs) != null)
                {
                    ns = testNs;
                    break;
                }
            }
        }
        return ns;
    }
    
    项目:consulo-javascript    文件:JavaScriptSymbolContributor.java   
    @NotNull
    @Override
    public String[] getNames(Project project,boolean includeNonProjectItems)
    {
        final Set<String> result = new HashSet<String>();
    
        result.addAll(StubIndex.getInstance().getAllKeys(JavaScriptIndexKeys.ELEMENTS_BY_NAME,project));
    
        FileBasedindex.getInstance().processAllKeys(FilenameIndex.NAME,new Processor<String>()
        {
            @Override
            public boolean process(String s)
            {
                if(JavaScriptSupportLoader.isFlexMxmFile(s))
                {
                    result.add(FileUtil.getNameWithoutExtension(s));
                }
                return true;
            }
        },project);
        return result.toArray(new String[result.size()]);
    }
    
    项目:consulo-javascript    文件:BaseJSGenerateAction.java   
    @Override
    public void actionPerformed(final AnActionEvent e)
    {
        Editor editor = e.getData(PlatformDataKeys.EDITOR);
        PsiFile psifile = e.getData(LangDataKeys.PSI_FILE);
        Project project = e.getData(PlatformDataKeys.PROJECT);
    
        final VirtualFile file = e.getData(PlatformDataKeys.VIRTUAL_FILE);
        if(JavaScriptSupportLoader.isFlexMxmFile(file))
        {
            editor = BaseCodeInsightAction.getInjectedEditor(project,editor);
            psifile = PsiUtilBase.getPsiFileInEditor(editor,project);
        }
    
        new JavaScriptGenerateAccessorHandler(getGenerationMode()).invoke(project,editor,psifile);
    }
    
    项目:consulo-javascript    文件:JSUntypedDeclarationinspection.java   
    private static void process(final JSNamedElement node,final ProblemsHolder holder)
    {
        if(node.getContainingFile().getLanguage() != JavaScriptSupportLoader.ECMA_SCRIPT_L4)
        {
            return;
        }
        PsiElement nameIdentifier = node.getNameIdentifier();
    
        if(nameIdentifier != null &&
                JSPsiImplUtils.getTypeFromDeclaration(node) == null &&
                (!(node instanceof JSParameter) || !((JSParameter) node).isRest()))
        {
            holder.registerProblem(nameIdentifier,JavaScriptBundle.message(node instanceof JSFunction ? "js.untyped.function.problem" : "js.untyped" +
                    ".variable.problem",nameIdentifier.getText()),ProblemHighlightType.GENERIC_ERROR_OR_WARNING,new AddTypetoDclFix());
        }
    }
    
    项目:emberjs-plugin    文件:EmberJSParser.java   
    public EmberJSParser(PsiBuilder builder) {
        super(JavaScriptSupportLoader.JAVASCRIPT_1_5,builder);
        myExpressionParser = new EmberJSExpressionParser();
        myStatementParser = new StatementParser<EmberJSParser>(this) {
            @Override
            protected void doParseStatement(boolean canHaveClasses) {
                final IElementType firstToken = builder.getTokenType();
                if (firstToken == JSTokenTypes.LBRACE) {
                    parseExpressionStatement();
                    checkForSemicolon();
                    return;
                }
                if (isIdentifierToken(firstToken)) {
                    final IElementType nextToken = builder.lookAhead(1);
                    if (nextToken == JSTokenTypes.IN_KEYWORD) {
                        parseInStatement();
                        return;
                    }
                }
                if (builder.getTokenType() == JSTokenTypes.LPAR) {
                    if (parseInStatement()) {
                        return;
                    }
                }
                super.doParseStatement(canHaveClasses);
            }
    
            private boolean parseInStatement() {
                PsiBuilder.Marker statement = builder.mark();
                if (!getExpressionParser().parseInExpression()) {
                    statement.drop();
                    return false;
                }
                statement.done(JSElementTypes.EXPRESSION_STATEMENT);
                return true;
            }
        };
    }
    
    项目:consulo-javascript    文件:JSDocumentationProvider.java   
    private static String doGenerateDoc(final JSFunction function)
    {
        StringBuilder builder = new StringBuilder();
        final JSParameterList parameterList = function.getParameterList();
        final PsiFile containingFile = function.getContainingFile();
        final boolean ecma = containingFile.getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4;
    
        if(parameterList != null)
        {
            for(JSParameter parameter : parameterList.getParameters())
            {
                builder.append("* @param ").append(parameter.getName());
                //String s = JSPsiImplUtils.getTypeFromDeclaration(parameter);
                //if (s != null) builder.append(" : ").append(s);
                builder.append("\n");
            }
        }
    
        if(ecma)
        {
            String s = JSPsiImplUtils.getTypeFromDeclaration(function);
    
            if(s != null && !"void".equals(s))
            {
                builder.append("* @return ");
    
                //builder.append(s);
                builder.append("\n");
            }
        }
    
        return builder.toString();
    }
    
    项目:consulo-javascript    文件:JSResolveUtil.java   
    public static Collection<JSQualifiednamedElement> findElementsByName(String name,Project project,GlobalSearchScope scope)
    {
        final Set<JSQualifiednamedElement> result = new HashSet<JSQualifiednamedElement>();
        Collection<JSQualifiednamedElement> jsQualifiednamedElements = StubIndex.getElements(JavaScriptIndexKeys.ELEMENTS_BY_NAME,name,project,scope,JSQualifiednamedElement.class);
    
        for(JSQualifiednamedElement e : jsQualifiednamedElements)
        {
            result.add((JSQualifiednamedElement) e.getNavigationElement());
        }
    
        Collection<VirtualFile> files = new ArrayList<VirtualFile>();
        files.addAll(FileBasedindex.getInstance().getContainingFiles(FilenameIndex.NAME,name + JavaScriptSupportLoader.MXML_FILE_EXTENSION_DOT,scope));
        files.addAll(FileBasedindex.getInstance().getContainingFiles(FilenameIndex.NAME,name + JavaScriptSupportLoader.MXML_FILE_EXTENSION2_DOT,scope));
    
        for(final VirtualFile file : files)
        {
            if(!file.isValid())
            {
                continue;
            }
            final PsiFile psiFile = PsiManager.getInstance(project).findFile(file);
            if(psiFile != null)
            {
                result.add(XmlBackedJSClassImpl.getXmlBackedClass((XmlFile) psiFile));
            }
        }
        return result;
    }
    
    项目:consulo-javascript    文件:JSResolveUtil.java   
    public static String getQNametoStartHierarchySearch(final JSFunction node)
    {
        PsiElement parentNode = node.getParent();
        parentNode = getClassReferenceForXmlFromContext(parentNode);
    
        if(parentNode instanceof JSClass)
        {
            final JSAttributeList attributeList = node.getAttributeList();
    
            if(attributeList == null ||
                    !attributeList.hasModifier(JSAttributeList.ModifierType.OVERRIDE) ||
                    attributeList.hasModifier(JSAttributeList.ModifierType.STATIC) ||
                    attributeList.getAccesstype() == JSAttributeList.Accesstype.PRIVATE)
            {
                return null;
            }
    
            if(parentNode instanceof JSClass)
            {
                return ((JSClass) parentNode).getQualifiedname();
            }
        }
        else if(node instanceof JSFunctionExpression && parentNode.getContainingFile().getLanguage() != JavaScriptSupportLoader.ECMA_SCRIPT_L4)
        {
            final ContextResolver resolver = new ContextResolver(node.getFirstChild());
            return resolver.getQualifierAsstring();
        }
        else if(parentNode instanceof JSFile && parentNode.getContainingFile().getLanguage() != JavaScriptSupportLoader.ECMA_SCRIPT_L4)
        {
            return node.getName();
        }
        return null;
    }
    
    项目:consulo-javascript    文件:JSResolveUtil.java   
    public ImplicitJSVariableImpl(final String name,String qName,PsiFile containingFile)
    {
        super(containingFile.getManager(),JavaScriptSupportLoader.ECMA_SCRIPT_L4.getBaseLanguage());
        myContainingFile = containingFile;
        myName = name;
        myType = qName;
    }
    
    项目:consulo-javascript    文件:JSImportHandlingUtil.java   
    public static boolean isAdequatePlaceForImport(final PsiNamedElement parent,@NotNull PsiElement place)
    {
        if(parent instanceof JSFile && !parent.getLanguage().isKindOf(JavaScriptSupportLoader.ECMA_SCRIPT_L4))
        {
            return false;
        }
    
        if(place instanceof JSReferenceExpression)
        {
            final PsiElement placeParent = place.getParent();
    
            if(placeParent instanceof JSReferenceExpression)
            {
                final PsiElement currentParent = JSResolveUtil.getTopReferenceParent(placeParent);
    
                if(JSResolveUtil.isSelfReference(currentParent,place) ||
                        //currentParent instanceof JSDeFinitionExpression ||
                        currentParent instanceof JSReferenceList)
                {
                    return false;
                }
            }
        }
        else if(place instanceof JSDocTagValue)
        {
            // further conditions to come
        }
        else
        {
            if(!(place instanceof JSFile))
            {
                return false;
            }
        }
    
        return true;
    }
    
    项目:consulo-javascript    文件:JSParameterInfoHandler.java   
    public static String getSignatureForParameter(final JSParameter p,boolean skipType)
    {
        final String s = skipType ? null : p.getTypestring();
    
        if(s != null && s.length() > 0)
        {
            final boolean ecmal4 = p.getContainingFile().getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4;
            String result;
    
            if(ecmal4)
            {
                if(p.isRest())
                {
                    result = "...";
                }
                else
                {
                    result = p.getName() + ":" + s;
                }
            }
            else
            {
                result = "[" + s + "] " + p.getName();
            }
            final String initializerText = p.getinitializerText();
            if(initializerText != null)
            {
                result += " = " + initializerText;
            }
            return result;
        }
        return p.getName();
    }
    
    项目:consulo-javascript    文件:JSWithTryCatchFinallySurrounder.java   
    protected static String getExceptionVarTypeBasedOnContext(@NotNull PsiElement context)
    {
        if(context.getContainingFile().getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4)
        {
            return ":Error";
        }
        return "";
    }
    
    项目:consulo-javascript    文件:BaseJSGenerateAction.java   
    @Override
    public void update(final AnActionEvent e)
    {
        final VirtualFile file = e.getData(PlatformDataKeys.VIRTUAL_FILE);
    
        boolean status = false;
    
        if(file != null)
        {
            if(file.getFileType() == JavaScriptFileType.INSTANCE)
            {
                final Editor editor = e.getData(PlatformDataKeys.EDITOR);
                final PsiFile psifile = e.getData(LangDataKeys.PSI_FILE);
    
                if(editor != null && psifile != null)
                {
                    status = psifile.getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4;
                }
            }
            else if(JavaScriptSupportLoader.isFlexMxmFile(file))
            {
                status = true;
            }
        }
    
        e.getPresentation().setEnabled(status);
        e.getPresentation().setVisible(status);
    }
    
    项目:consulo-javascript    文件:JSUnresolvedFunctioninspection.java   
    private static ProblemHighlightType getHighlightTypeForTypeOrSignatureProblem(@NotNull PsiElement node)
    {
        if(node.getContainingFile().getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4)
        {
            return ProblemHighlightType.GENERIC_ERROR;
        }
        return ProblemHighlightType.GENERIC_ERROR_OR_WARNING;
    }
    
    项目:consulo-javascript    文件:JSIntroduceFieldHandler.java   
    @Override
    protected JSExpression findIntroducedExpression(final PsiFile file,final int start,final int end,Editor editor)
    {
        if(file.getLanguage() != JavaScriptSupportLoader.ECMA_SCRIPT_L4)
        {
            CommonRefactoringUtil.showErrorHint(file.getProject(),JavaScriptBundle.message("javascript.introduce.field.error.not.available.in.javascript" +
                    ".code"),getRefactoringName(),null);
            return null;
        }
    
        return super.findIntroducedExpression(file,start,end,editor);
    }
    
    项目:consulo-javascript    文件:JssplitDeclarationAndInitializationIntention.java   
    @Override
    public void processIntention(@NotNull PsiElement element) throws IncorrectOperationException {
           assert (element instanceof JSVarStatement);
    
           final JSVarStatement varStatement      = (JSVarStatement) element;
           StringBuilder        declarationBuffer = new StringBuilder();
           List<String>         initializations   = new ArrayList<String>();
    
           for (JSVariable variable : varStatement.getvariables()) {
               declarationBuffer.append((declarationBuffer.length() == 0) ? VAR_KEYWORD : ",")
                                .append(variable.getName());
    
               String s = JSPsiImplUtils.getTypeFromDeclaration(variable);
               final PsiFile containingFile = element.getContainingFile();
    
               if (s == null && containingFile.getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4) {
                   s = JSResolveUtil.getExpressionType(variable.getinitializer(),containingFile);
               }
    
               if (s != null) {
                   declarationBuffer.append(":").append(s);
               }
               if (variable.hasInitializer()) {
                   initializations.add(variable.getName() + '=' + variable.getinitializer().getText() + ';');
               }
           }
           declarationBuffer.append(';');
    
           // Do replacement.
           Jsstatement newStatement = JSElementFactory.replaceStatement(varStatement,declarationBuffer.toString());
    
           for (final String initialization : initializations) {
               newStatement = JSElementFactory.addStatementAfter(newStatement,initialization);
           }
       }
    
    项目:consulo-javascript    文件:JSResolveUtil.java   
    public static boolean isNewResolveAndCompletion(PsiFile psiFile)
    {
        return psiFile.getLanguage().isKindOf(JavaScriptSupportLoader.ECMA_SCRIPT_L4) || JavaScriptSupportLoader.isFlexMxmFile(psiFile);
    }
    
    项目:consulo-javascript    文件:ResolveProcessor.java   
    public ResolveProcessor(final String name,PsiElement _place)
    {
        myName = name;
        place = _place;
        final boolean b = place instanceof JSReferenceExpression && ((JSReferenceExpression) place).getQualifier() == null;
        allowUnqualifiedStaticsFromInstance = b;
    
        if(myName != null && place instanceof JSReferenceExpression)
        {
            final ASTNode node = place.getNode().findChildByType(JSTokenTypes.COLON_COLON);
            String explicitNs = null;
    
            // Todo: e.g. protected is also ns
            if(node != null)
            {
                final JSExpression expression = ((JSReferenceExpression) place).getQualifier();
                if(expression instanceof JSReferenceExpression)
                {
                    anyNsAllowed = ((JSReferenceExpression) expression).resolve() instanceof JSVariable;
                }
    
                explicitNs = expression != null ? expression.getText() : null;
            }
            else
            {
                final JSExpression qualifier = ((JSReferenceExpression) place).getQualifier();
    
                if(qualifier instanceof JSReferenceExpression && qualifier.getNode().findChildByType(JSTokenTypes.COLON_COLON) != null)
                {
                    anyNsAllowed = ((JSReferenceExpression) qualifier).resolve() instanceof JSVariable;
                    explicitNs = ((JSReferenceExpression) qualifier).getReferencedname();
                }
            }
    
            if(explicitNs != null && !anyNsAllowed)
            {
                openednses = new THashSet<String>();
                openednses.add(explicitNs);
                defaultNsIsNotAllowed = true;
            }
        }
    
        if(myName == null && place instanceof JSReferenceExpression)
        {
            PsiElement parent = place.getParent();
    
            if(parent instanceof JSReferenceList)
            {
                if(parent.getNode().getElementType() == JSElementTypes.EXTENDS_LIST)
                {
                    final PsiElement element = parent.getParent();
                    if(element instanceof JSClass)
                    {
                        if(((JSClass) element).isInterface())
                        {
                            myAcceptOnlyClasses = false;
                            myAcceptOnlyInterfaces = true;
                        }
                        else
                        {
                            myAcceptOnlyClasses = true;
                            myAcceptOnlyInterfaces = false;
                        }
                    }
                }
                else
                {
                    myAcceptOnlyClasses = false;
                    myAcceptOnlyInterfaces = true;
                }
            }
        }
    
        ecma = place != null && place.getContainingFile().getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4;
    }
    
    项目:consulo-javascript    文件:XmlBackedJSClassImpl.java   
    public static boolean isInlineComponentTag(XmlTag tag)
    {
        return COMPONENT_TAG_NAME.equals(tag.getLocalName()) &&
                JavaScriptSupportLoader.isMxmlNs(tag.getNamespace()) &&
                !(tag.getParent() instanceof XmlDocument);
    }
    
    项目:consulo-javascript    文件:JSUnresolvedFunctioninspection.java   
    static ProblemHighlightType getUnresolveReferenceHighlightType(final @Nullable JSExpression qualifier,@NotNull JSExpression node)
    {
        JSClass jsClass;
    
        final PsiFile containingFile = node.getContainingFile();
        if(qualifier != null)
        {
            jsClass = JSResolveUtil.findClassOfQualifier(qualifier,containingFile);
    
            if(jsClass == null && (qualifier instanceof JSReferenceExpression))
            {
                ResolveResult[] results = ((JSReferenceExpression) qualifier).multiResolve(false);
    
                if(results.length != 0)
                {
                    PsiElement resultElement = results[0].getElement();
                    String type = null;
    
                    if(resultElement instanceof JSVariable)
                    {
                        type = ((JSVariable) resultElement).getTypestring();
                    }
                    else if(resultElement instanceof JSFunction)
                    {
                        type = ((JSFunction) resultElement).getReturnTypestring();
                    }
    
                    if("*".equals(type))
                    {
                        return ProblemHighlightType.LIKE_UNKNowN_SYMBOL;
                    }
                    jsClass = JSResolveUtil.getClassOfContext(resultElement);
                }
            }
        }
        else
        {
            jsClass = JSResolveUtil.getClassOfContext(node);
        }
    
        final boolean ecmaL4File = containingFile.getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4;
    
        if(jsClass != null && ecmaL4File &&
                (!(jsClass instanceof XmlBackedJSClassImpl) || jsClass.getContainingFile().getFileType() == XmlFileType.INSTANCE))
        {
            final JSAttributeList attributeList = jsClass.getAttributeList();
            if(attributeList == null || !attributeList.hasModifier(JSAttributeList.ModifierType.DYNAMIC))
            {
                return ProblemHighlightType.ERROR;
            }
        }
    
        if(ecmaL4File && jsClass == null && node.getParent() instanceof JSReferenceList)
        {
            return ProblemHighlightType.ERROR;
        }
        return ProblemHighlightType.LIKE_UNKNowN_SYMBOL;
    }
    
    项目:consulo-javascript    文件:ECMAScriptImportOptimizer.java   
    @Override
    public boolean supports(PsiFile file)
    {
        return file.getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4 || JavaScriptSupportLoader.isFlexMxmFile(file);
    }
    
    项目:consulo-javascript    文件:FunctionWithInconsistentReturnsJSinspection.java   
    @Override
    protected ProblemHighlightType getProblemHighlightType(PsiElement location) {
              return location.getContainingFile().getLanguage() == JavaScriptSupportLoader.ECMA_SCRIPT_L4 ?
                     ProblemHighlightType.GENERIC_ERROR:super.getProblemHighlightType(location);
          }
    

    dalvik.system.BaseDexClassLoader.findClass中的java.lang.ClassNotFoundException

    dalvik.system.BaseDexClassLoader.findClass中的java.lang.ClassNotFoundException

    这个错误让我发疯.从Google Play商店下载时,我的应用在启动时崩溃并出现以下错误:

    java.lang.classNotFoundException
    in dalvik.system.BaseDexClassLoader.findClass
    

    在我们的两个设备上使用eclipse构建时,我的应用程序不会崩溃.然而一个月前,一个客户使用他的手机构建我们的应用程序,然后它也在启动时崩溃.我忽略了这个问题,因为它正在我们的设备上工作,并认为它与谷歌地图键或密钥库有关.

    现在,当从Play商店下载时,我们的应用程序崩溃了.我知道没有一种简单的方法可以解决这个问题,但是我们会理解正确的方向.

    我也发现很难调试这个问题,因为在我们的设备上使用eclipse构建应用程序时效果很好!

    这是我报告的完整错误日志:

    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.denederlandsewateren.winkeloord/com.denederlandsewateren.views.StartScreenActivity}: java.lang.classNotFoundException: com.denederlandsewateren.views.StartScreenActivity
    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2099)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
    at android.app.ActivityThread.access$600(ActivityThread.java:142)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4931)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.classNotFoundException: com.denederlandsewateren.views.StartScreenActivity
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
    at java.lang.classLoader.loadClass(ClassLoader.java:501)
    at java.lang.classLoader.loadClass(ClassLoader.java:461)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
    at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2090)
    ... 11 more
    

    再说一遍,除了对这个问题的直接回答,但也许有人可以对这个错误日志提供的问题有所了解.

    编辑

    如果有帮助,这是清单文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.xxxx.xxxxx"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <permission
            android:name="com.xxxxx.xxxxx.MAPS_RECEIVE"
            android:protectionLevel="signature" />
        <permission
            android:name="com.xxxxx.xxxxx.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
    
        <uses-permission android:name="my_app_package.permission.C2D_MESSAGE" />
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="com.xxxxxx.xxxxx.MAPS_RECEIVE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
        <uses-feature
            android:glEsversion="0x00020000"
            android:required="true" />
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="17" />
    
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CALL_PHONE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.VIBRATE" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/app_icon"
            android:label="@string/app_name"
            android:theme="@style/Theme.Sherlock" >
            <service android:name="com.xxxxxx.xxxxx.GCMIntentService" />
    
            <Meta-data
                android:name="com.google.android.maps.v2.API_KEY"
                android:value="xxxxxxxx" />
    
            <receiver
                android:name="com.google.android.gcm.GCMbroadcastReceiver"
                android:permission="com.google.android.c2dm.permission.SEND" >
                <intent-filter>
                    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    
                    <category android:name="com.xxxxxx.xxxxxxx" />
                </intent-filter>
            </receiver>
    
            <activity
                android:name="com.xxxxx.xxxxx.MainActivity"
                android:label="@string/app_name"
                android:screenorientation="portrait">
                <!--<intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter> -->
            </activity>
    
            <Meta-data
                android:name="com.facebook.sdk.ApplicationId"
                android:value="@string/app_id" />
    
            <activity android:name="com.facebook.LoginActivity" >
            </activity>
            <activity
                android:name="com.xxxxxx.xxxxxx.StartScreenActivity"
                android:label="@string/app_name" 
                android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
                android:screenorientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    编辑

    在设备上安装应用程序时添加了详细日志

    03-30 17:56:28.554: D/dalvikvm(5150): GC_FOR_ALLOC freed 233K, 68% free 2639K/8195K, paused 13ms, total 13ms
    03-30 17:56:28.574: I/dalvikvm-heap(5150): Grow heap (frag case) to 26.682MB for 16777232-byte allocation
    03-30 17:56:28.594: D/dalvikvm(5150): GC_CONCURRENT freed <1K, 23% free 19022K/24647K, paused 2ms+9ms, total 21ms
    03-30 17:56:29.114: D/dalvikvm(5150): GC_FOR_ALLOC freed 0K, 23% free 19022K/24647K, paused 15ms, total 15ms
    03-30 17:56:29.129: I/dalvikvm-heap(5150): Grow heap (frag case) to 35.681MB for 9437200-byte allocation
    03-30 17:56:29.169: D/dalvikvm(5150): GC_CONCURRENT freed 0K, 17% free 28238K/33927K, paused 2ms+2ms, total 38ms
    03-30 17:56:29.254: D/libEGL(5150): loaded /system/lib/egl/libEGL_mali.so
    03-30 17:56:29.259: D/libEGL(5150): loaded /system/lib/egl/libGLESv1_CM_mali.so
    03-30 17:56:29.259: D/libEGL(5150): loaded /system/lib/egl/libGLESv2_mali.so
    03-30 17:56:29.284: D/Openglrenderer(5150): Enabling debug mode 0
    03-30 17:56:32.154: D/KEY(5150): UUID
    03-30 17:56:32.179: I/System.out(5150): UUID: xxxxxxxxxxxxxx
    03-30 17:56:32.179: E/SerializeObject(5150): FileNot Found in ReadSettings filename = xxxxx.dat
    03-30 17:56:32.184: D/GCMRegistrar(5150): resetting backoff for com.xxxxx.xxxxx
    03-30 17:56:32.214: V/GCMRegistrar(5150): Registering app com.xxxxx.xxxxx of senders 752727514714
    03-30 17:56:32.214: D/KEY(5150): pushEnabled
    03-30 17:56:32.324: V/SlidingMenu(5150): setting padding!
    03-30 17:56:32.394: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.394: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.394: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.409: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.414: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.414: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.424: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.424: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.429: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.434: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.434: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.434: W/AllCapsTransformationMethod(5150): Caller did not enable length changes; not transforming text
    03-30 17:56:32.459: V/CustomViewBehind(5150): behind INVISIBLE
    03-30 17:56:36.894: D/dalvikvm(5150): GC_CONCURRENT freed 20031K, 58% free 15574K/36551K, paused 4ms+7ms, total 49ms
    03-30 17:56:36.894: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 31ms
    03-30 17:56:37.504: I/System.out(5150): Vaarapp ID: 5
    03-30 17:56:37.534: I/Choreographer(5150): Skipped 122 frames!  The application may be doing too much work on its main thread.
    03-30 17:56:37.539: V/GCMbroadcastReceiver(5150): onReceive: com.google.android.c2dm.intent.REGISTRATION
    03-30 17:56:37.544: V/GCMbroadcastReceiver(5150): GCM IntentService class: com.xxxxx.xxxxx.GCMIntentService
    03-30 17:56:37.549: V/GCMBaseIntentService(5150): Acquiring wakelock
    03-30 17:56:37.794: V/GCMBaseIntentService(5150): Intent service name: GCMIntentService-DynamicSenderIds-1
    03-30 17:56:37.794: E/GCMRegistrar(5150): internal error: retry receiver class not set yet
    03-30 17:56:37.794: V/GCMRegistrar(5150): Registering receiver
    03-30 17:56:37.799: D/GCMBaseIntentService(5150): handleRegistration: registrationId = xxxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxx-xxxxx-xxxx, error = null, unregistered = null
    03-30 17:56:37.799: D/GCMRegistrar(5150): resetting backoff for com.xxxxx.xxxxx
    03-30 17:56:37.799: V/GCMRegistrar(5150): Saving regId on app version 1
    03-30 17:56:37.829: V/GCMBaseIntentService(5150): Releasing wakelock
    03-30 17:56:39.169: D/dalvikvm(5150): GC_CONCURRENT freed 2248K, 52% free 17830K/36551K, paused 6ms+12ms, total 95ms
    03-30 17:56:39.169: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 12ms
    03-30 17:56:39.174: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 48ms
    03-30 17:56:41.164: I/dalvikvm(5150): Jit: resizing JitTable from 4096 to 8192
    03-30 17:56:42.229: D/dalvikvm(5150): GC_CONCURRENT freed 4265K, 49% free 18778K/36551K, paused 3ms+6ms, total 58ms
    03-30 17:56:42.229: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 41ms
    03-30 17:56:42.234: D/dalvikvm(5150): WAIT_FOR_CONCURRENT_GC blocked 46ms
    03-30 17:57:51.759: D/dalvikvm(5150): GC_CONCURRENT freed 5476K, 49% free 18775K/36551K, paused 21ms+6ms, total 196ms
    

    解决方法:

    因此ProGuard确实从我的项目中剥离了代码.我使用ActionBarSherlock和facebook,这是我添加的,所以它会工作:

    # ActionBarSherlock 
    
    -keep class android.support.** { *; } 
    
    -keep interface android.support.** { *; } 
    
    -keep class com.actionbarsherlock.** { *; } 
    
    -keep interface com.actionbarsherlock.** { *; } 
    
    
    
    
    # Keep line numbers to alleviate debugging stack traces 
    
    -renamesourcefileattribute SourceFile 
    
    -keepattributes SourceFile,LineNumberTable
    

    这适用于Facebook:

    -keepclassmembers class * implements java.io.Serializable
    {
        private static final java.io.ObjectStreamField[] serialPersistentFields;
        private void writeObject(java.io.ObjectOutputStream);
        private void readobject(java.io.ObjectInputStream);
        java.lang.Object writeReplace();
        java.lang.Object readResolve();
    }
    

    关于跨ClassLoader的Java 8 ScriptEnginejava跨类调用的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)中的类加载错误?、ClassLoader.loadClass() throws java.lang.ClassNotFoundException、com.intellij.lang.javascript.JavaScriptSupportLoader的实例源码、dalvik.system.BaseDexClassLoader.findClass中的java.lang.ClassNotFoundException的相关知识,请在本站寻找。

    本文标签: