溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么查看jar包下java類

發(fā)布時(shí)間:2021-08-25 18:44:07 來(lái)源:億速云 閱讀:145 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“怎么查看jar包下java類”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么查看jar包下java類”吧!

查看java類在那個(gè)jar包

java添加classpath

 linux示例:添加 -classpath xxx/xxx.jar:xxx/xxx.jar

如果是windows用;分割,如果是mac和linux用:分割

java編譯

javac -d . xxx.java

點(diǎn)代表當(dāng)前目錄如果沒報(bào)名可以不加-d .
 示例
 javac -d . Test.java

運(yùn)行

 java com.dxz.chama.javaagent.asm.Test
 
如果添加class資源運(yùn)行

 java -classpath xxx/xxx.jar:xxx/xxx.jar com.dxz.chama.javaagent.asm.Test
package com.dxz.chama.javaagent.asm;

import java.net.URL;

/**
 * description: 查找某個(gè)類在那個(gè)jar包下
 *
 * @author: he QQ:       905845006
 * @email: 905845006@qq.com
 * @date: 2020/8/15    5:39 PM
 */
public class Test {

    public static void main(String args[]) {
        Class targetclass = String.class;
        String className = targetclass.getName();
        className= "sun.net.www.protocol.http.HttpURLConnection";
        className = className.replace('.', '/');
        String resource = "/" + className + ".class";
        URL url = targetclass.getResource(resource);
        System.out.println(url.getFile());
        // 輸出結(jié)果:
        // file:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre/lib/rt.jar!/sun/net/www/protocol/http/HttpURLConnection.class
    }
}
查看jar包下java類
package com.dxz.chama.javaagent.asm;

/**
 * description:
 *
 * @author: he QQ:       905845006
 * @email: 905845006@qq.com
 * @date: 2020/8/15    3:11 PM
 */

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class jarTest {

    public static void getJarName(String jarFile) throws Exception {
        getJarName(jarFile,null);
    }

    public static void getJarName(String jarFile, String clazz) throws Exception {
        try {
            //通過(guò)將給定路徑名字符串轉(zhuǎn)換為抽象路徑名來(lái)創(chuàng)建一個(gè)新File實(shí)例
            File f = new File(jarFile);
            URL url1 = f.toURI().toURL();
            URLClassLoader myClassLoader = new URLClassLoader(new URL[]{url1}, Thread.currentThread().getContextClassLoader());

            //通過(guò)jarFile和JarEntry得到所有的類
            JarFile jar = new JarFile(jarFile);
            //返回zip文件條目的枚舉
            Enumeration<JarEntry> enumFiles = jar.entries();
            JarEntry entry;

            System.out.println(enumFiles);
            //測(cè)試此枚舉是否包含更多的元素
            while (enumFiles.hasMoreElements()) {
                entry = (JarEntry) enumFiles.nextElement();
                if (entry.getName().indexOf("META-INF") < 0) {
                    String classFullName = entry.getName();
                    if (!classFullName.endsWith(".class")) {
                        classFullName = classFullName.substring(0, classFullName.length() - 1);
                    } else {
                        //去掉后綴.class
                        String className = classFullName.substring(0, classFullName.length() - 6).replace("/", ".");
                        if (className.equals("module-info")) {
                            System.out.println("is jdk9 continue");
                            continue;
                        }
                        //如果傳入指定類 只查看指定類
                        if (clazz != null && !className.equals(clazz)) {
                            continue;
                        }

                        System.out.println("className:"+className);
                        Class<?> myclass = myClassLoader.loadClass(className);
                        //打印類名
                        System.out.println("*****************************");
                        System.out.println("全類名:" + className);

                        //得到類中包含的屬性
                        Method[] methods = myclass.getMethods();
                        for (Method method : methods) {
                            String methodName = method.getName();
                            System.out.println("方法名稱:" + methodName);
                            Class<?>[] parameterTypes = method.getParameterTypes();
                            for (Class<?> clas : parameterTypes) {
                                // String parameterName = clas.getName();
                                String parameterName = clas.getSimpleName();
                                System.out.println("參數(shù)類型:" + parameterName);
                            }
                            System.out.println("==========================");
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    /**
     * 這些默認(rèn)方法不打印
     */
    private static String DEFAULT_METHOD = "waitequalsnotifynotifyAlltoStringhashCodegetClass";

    //必須傳1個(gè)參數(shù),指定的jar包,如果傳2個(gè)參數(shù),第一個(gè)為jar包,第二個(gè)為需要找的類

    public static void main(String[] args) throws Exception {
        //jar包所在路徑
            /*getJarName("F:\\user.jar");
            getJarName("F:\\role1.jar");
            getJarName("F:\\role2.jar"); */
        //getJarName("F:\\UserInfo.jar");

        String jarz = null;
        String clazz = null;
        if(args.length>1){
            jarz = args[0];
            clazz = args[1];
        }else{
            jarz = args[0];
        }
        if (jarz != null) {
            getJarName(jarz);
        }
        //org.apache.tools.ant.util.ResourceUtils$ResourceSelectorProvider
        if (jarz != null && clazz != null) {
            System.out.println("示例類格式:org.apache.tools.ant.util.ResourceUtils$ResourceSelectorProvider");
            getJarName(jarz, clazz);
        }
        //測(cè)試
//        getJarName("/Users/heliming/IdeaProjects/bugokhttp/asm6/target/asm6-1.0-SNAPSHOT.jar");

    }

}

補(bǔ)充:

ClassNotFoundException解釋:

當(dāng)應(yīng)用程序運(yùn)行的過(guò)程中嘗試使用類加載器去加載Class文件的時(shí)候,如果沒有在classpath中查找到指定的類,就會(huì)拋出ClassNotFoundException。一般情況下,當(dāng)我們使用Class.forName()或者ClassLoader.loadClass以及使用ClassLoader.findSystemClass()在運(yùn)行時(shí)加載類的時(shí)候,如果類沒有被找到,那么就會(huì)導(dǎo)致JVM拋出ClassNotFoundException。

NoClassDefFoundError解釋:

當(dāng)JVM在加載一個(gè)類的時(shí)候,如果這個(gè)類在編譯時(shí)是可用的,但是在運(yùn)行時(shí)找不到這個(gè)類的定義的時(shí)候,JVM就會(huì)拋出一個(gè)NoClassDefFoundError錯(cuò)誤。比如當(dāng)我們?cè)趎ew一個(gè)類的實(shí)例的時(shí)候,如果在運(yùn)行是類找不到,則會(huì)拋出一個(gè)NoClassDefFoundError的錯(cuò)誤。

到此,相信大家對(duì)“怎么查看jar包下java類”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI