精华内容
下载资源
问答
  • java 获取某个包下的所有类名

    万次阅读 2017-07-07 14:51:18
    java 获取某个包下的所有类名 (中文路径)

    本方法支持class 模式和jar 包模式

    package com.yoke.util;
    
    import com.yoke.md5util.UrlDecode;
    import com.yoke.util.file.FileUtil;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
    
    /**
     * @author jiangzeyin
     * @date 2016-9-9
     */
    public class PackageUtil {
    
        /**
         * 获取某包下(包括该包的所有子包)所有类
         *
         * @param packageName 包名
         * @return 类的完整名称
         * @throws UnsupportedEncodingException
         */
        public static List<String> getClassName(String packageName) throws IOException {
            return getClassName(packageName, true);
        }
    
        /**
         * 获取某包下所有类
         *
         * @param packageName  包名
         * @param childPackage 是否遍历子包
         * @return 类的完整名称
         * @throws UnsupportedEncodingException
         */
        public static List<String> getClassName(String packageName, boolean childPackage) throws IOException {
            List<String> fileNames = new ArrayList<>();
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            String packagePath = packageName.replace(".", "/");
            Enumeration<URL> urls = loader.getResources(packagePath);
            while (urls.hasMoreElements()) {
                URL url = urls.nextElement();
                if (url == null)
                    continue;
                String type = url.getProtocol();
                if (type.equals("file")) {
                    fileNames.addAll(getClassNameByFile(url.getPath(), childPackage));
                } else if (type.equals("jar")) {
                    fileNames.addAll(getClassNameByJar(url.getPath(), childPackage));
                }
            }
            fileNames.addAll(getClassNameByJars(((URLClassLoader) loader).getURLs(), packagePath, childPackage));
            return fileNames;
        }
    
        /**
         * 从项目文件获取某包下所有类
         *
         * @param filePath     文件路径
         *                     类名集合
         * @param childPackage 是否遍历子包
         * @return 类的完整名称
         * @throws UnsupportedEncodingException
         */
        private static List<String> getClassNameByFile(String filePath, boolean childPackage) throws UnsupportedEncodingException {
            List<String> myClassName = new ArrayList<>();
            filePath = UrlDecode.getURLDecode(filePath);
            File file = new File(filePath);
            File[] childFiles = file.listFiles();
            if (childFiles == null)
                return myClassName;
            for (File childFile : childFiles) {
                if (childFile.isDirectory()) {
                    if (childPackage) {
                        myClassName.addAll(getClassNameByFile(childFile.getPath(), childPackage));
                    }
                } else {
                    String childFilePath = childFile.getPath();
                    childFilePath = FileUtil.clearPath(childFilePath);
                    if (childFilePath.endsWith(".class")) {
                        childFilePath = childFilePath.substring(childFilePath.indexOf("/classes/") + 9, childFilePath.lastIndexOf("."));
                        childFilePath = childFilePath.replace("/", ".");
                        myClassName.add(childFilePath);
                    }
                }
            }
            return myClassName;
        }
    
        /**
         * 从jar获取某包下所有类
         *
         * @param jarPath      jar文件路径
         * @param childPackage 是否遍历子包
         * @return 类的完整名称
         * @throws UnsupportedEncodingException
         */
        private static List<String> getClassNameByJar(String jarPath, boolean childPackage) throws UnsupportedEncodingException {
            List<String> myClassName = new ArrayList<String>();
            String[] jarInfo = jarPath.split("!");
            String jarFilePath = jarInfo[0].substring(jarInfo[0].indexOf("/"));
            jarFilePath = UrlDecode.getURLDecode(jarFilePath);
            String packagePath = jarInfo[1].substring(1);
            try {
                JarFile jarFile = new JarFile(jarFilePath);
                Enumeration<JarEntry> entrys = jarFile.entries();
                while (entrys.hasMoreElements()) {
                    JarEntry jarEntry = entrys.nextElement();
                    String entryName = jarEntry.getName();
                    if (entryName.endsWith(".class")) {
                        if (childPackage) {
                            if (entryName.startsWith(packagePath)) {
                                entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf("."));
                                myClassName.add(entryName);
                            }
                        } else {
                            int index = entryName.lastIndexOf("/");
                            String myPackagePath;
                            if (index != -1) {
                                myPackagePath = entryName.substring(0, index);
                            } else {
                                myPackagePath = entryName;
                            }
                            if (myPackagePath.equals(packagePath)) {
                                entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf("."));
                                myClassName.add(entryName);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                //SystemLog.Log(LogType.systemInfo, e.getMessage(), e);
            }
            return myClassName;
        }
    
        /**
         * 从所有jar中搜索该包,并获取该包下所有类
         *
         * @param urls         URL集合
         * @param packagePath  包路径
         * @param childPackage 是否遍历子包
         * @return 类的完整名称
         * @throws UnsupportedEncodingException
         */
        private static List<String> getClassNameByJars(URL[] urls, String packagePath, boolean childPackage) throws UnsupportedEncodingException {
            List<String> myClassName = new ArrayList<String>();
            if (urls != null) {
                for (int i = 0; i < urls.length; i++) {
                    URL url = urls[i];
                    String urlPath = url.getPath();
                    // 不必搜索classes文件夹
                    if (urlPath.endsWith("classes/")) {
                        continue;
                    }
                    String jarPath = urlPath + "!/" + packagePath;
                    myClassName.addAll(getClassNameByJar(jarPath, childPackage));
                }
            }
            return myClassName;
        }
    }

    本方法是本人在网上看到,拿来用后面发现如果class 所在路径中存在中文则不行,本方法修护了这个问题。

    关键代码是在 108行 对其路径进行url 编码

    展开全文
  • 这是我开发的一个定制解决方案来查找包的所有类:public class ClassFinder {private static final char PKG_SEPARATOR = '.';private static final char DIR_SEPARATOR = '/';private static final String CLASS_...

    这是我开发的一个定制解决方案来查找包的所有类:

    public class ClassFinder {

    private static final char PKG_SEPARATOR = '.';

    private static final char DIR_SEPARATOR = '/';

    private static final String CLASS_FILE_SUFFIX = ".class";

    private static final String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the package '%s' exists?";

    public static List> find(String scannedPackage) {

    String scannedPath = scannedPackage.replace(PKG_SEPARATOR,DIR_SEPARATOR);

    URL scannedUrl = Thread.currentThread().getContextClassLoader().getResource(scannedPath);

    if (scannedUrl == null) {

    throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR,scannedPath,scannedPackage));

    }

    File scannedDir = new File(scannedUrl.getFile());

    List> classes = new ArrayList>();

    for (File file : scannedDir.listFiles()) {

    classes.addAll(find(file,scannedPackage));

    }

    return classes;

    }

    private static List> find(File file,String scannedPackage) {

    List> classes = new ArrayList>();

    String resource = scannedPackage + PKG_SEPARATOR + file.getName();

    if (file.isDirectory()) {

    for (File child : file.listFiles()) {

    classes.addAll(find(child,resource));

    }

    } else if (resource.endsWith(CLASS_FILE_SUFFIX)) {

    int endIndex = resource.length() - CLASS_FILE_SUFFIX.length();

    String className = resource.substring(0,endIndex);

    try {

    classes.add(Class.forName(className));

    } catch (ClassNotFoundException ignore) {

    }

    }

    return classes;

    }

    }

    然后,只需使用:

    List> classes = ClassFinder.find("com.package");

    @H_301_7@

    @H_301_7@

    总结

    如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

    如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

    展开全文
  • 参考来源:以下代码一键...import java.io.File;import java.io.IOException;import java.net.JarURLConnection;import java.net.URL;import java.net.URLClassLoader;import java.util.Enumeration;import java.u...

    参考来源:

    以下代码一键运行:

    package test;

    import java.io.File;

    import java.io.IOException;

    import java.net.JarURLConnection;

    import java.net.URL;

    import java.net.URLClassLoader;

    import java.util.Enumeration;

    import java.util.HashSet;

    import java.util.Set;

    import java.util.jar.JarEntry;

    import java.util.jar.JarFile;

    public class ClassUtils {

    public static void main(String[] args) throws Exception {

    String packageName = "org.objectweb.asm";

    Set classNames = getClassName(packageName, false);

    if (classNames != null) {

    for (String className : classNames) {

    System.out.println(className);

    }

    }

    }

    /**

    * 获取某包下所有类

    * @param packageName 包名

    * @param isRecursion 是否遍历子包

    * @return 类的完整名称

    */

    public static Set getClassName(String packageName, boolean isRecursion) {

    Set classNames = null;

    ClassLoader loader = Thread.currentThread().getContextClassLoader();

    String packagePath = packageName.replace(".", "/");

    URL url = loader.getResource(packagePath);

    if (url != null) {

    String protocol = url.getProtocol();

    if (protocol.equals("file")) {

    classNames = getClassNameFromDir(url.getPath(), packageName, isRecursion);

    } else if (protocol.equals("jar")) {

    JarFile jarFile = null;

    try{

    jarFile = ((JarURLConnection) url.openConnection()).getJarFile();

    } catch(Exception e){

    e.printStackTrace();

    }

    if(jarFile != null){

    getClassNameFromJar(jarFile.entries(), packageName, isRecursion);

    }

    }

    } else {

    /*从所有的jar包中查找包名*/

    classNames = getClassNameFromJars(((URLClassLoader)loader).getURLs(), packageName, isRecursion);

    }

    return classNames;

    }

    /**

    * 从项目文件获取某包下所有类

    * @param filePath 文件路径

    * @param className 类名集合

    * @param isRecursion 是否遍历子包

    * @return 类的完整名称

    */

    private static Set getClassNameFromDir(String filePath, String packageName, boolean isRecursion) {

    Set className = new HashSet();

    File file = new File(filePath);

    File[] files = file.listFiles();

    for (File childFile : files) {

    if (childFile.isDirectory()) {

    if (isRecursion) {

    className.addAll(getClassNameFromDir(childFile.getPath(), packageName+"."+childFile.getName(), isRecursion));

    }

    } else {

    String fileName = childFile.getName();

    if (fileName.endsWith(".class") && !fileName.contains("$")) {

    className.add(packageName+ "." + fileName.replace(".class", ""));

    }

    }

    }

    return className;

    }

    /**

    * @param jarEntries

    * @param packageName

    * @param isRecursion

    * @return

    */

    private static Set getClassNameFromJar(Enumeration jarEntries, String packageName, boolean isRecursion){

    Set classNames = new HashSet();

    while (jarEntries.hasMoreElements()) {

    JarEntry jarEntry = jarEntries.nextElement();

    if(!jarEntry.isDirectory()){

    /*

    * 这里是为了方便,先把"/" 转成 "." 再判断 ".class" 的做法可能会有bug

    * (FIXME: 先把"/" 转成 "." 再判断 ".class" 的做法可能会有bug)

    */

    String entryName = jarEntry.getName().replace("/", ".");

    if (entryName.endsWith(".class") && !entryName.contains("$") && entryName.startsWith(packageName)) {

    entryName = entryName.replace(".class", "");

    if(isRecursion){

    classNames.add(entryName);

    } else if(!entryName.replace(packageName+".", "").contains(".")){

    classNames.add(entryName);

    }

    }

    }

    }

    return classNames;

    }

    /**

    * 从所有jar中搜索该包,并获取该包下所有类

    * @param urls URL集合

    * @param packageName 包路径

    * @param isRecursion 是否遍历子包

    * @return 类的完整名称

    */

    private static Set getClassNameFromJars(URL[] urls, String packageName, boolean isRecursion) {

    Set classNames = new HashSet();

    for (int i = 0; i < urls.length; i++) {

    String classPath = urls[i].getPath();

    //不必搜索classes文件夹

    if (classPath.endsWith("classes/")) {continue;}

    JarFile jarFile = null;

    try {

    jarFile = new JarFile(classPath.substring(classPath.indexOf("/")));

    } catch (IOException e) {

    e.printStackTrace();

    }

    if (jarFile != null) {

    classNames.addAll(getClassNameFromJar(jarFile.entries(), packageName, isRecursion));

    }

    }

    return classNames;

    }

    }

    展开全文
  • 需求 近来项目中有个新需求,审计记录中除了...项目加载时获取所有的Controller类 - 路径 - 接口名 - 接口说明 - 接口发布说明到系统全局变量 日志记录时根据url获取接口发布说明 实现代码 import java.util.ArrayList

    需求

    近来项目中有个新需求,审计记录中除了用户的访问地址还需要包含事件具体描述,项目是集成了swagger的,开发时接口上都用@ApiOperation写了接口说明,出于偷懒的心理尝试了一波根据url反向查找类名,接口名,注解值,尝试之后甚是觉得不偷懒的搬砖工一定不是好的泥水匠。。。

    实现思路

    • 项目加载时获取所有的Controller类 - 路径 - 接口名 - 接口说明 - 接口发布说明到系统全局变量
    • 日志记录时根据url获取接口发布说明

    实现代码

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import javax.servlet.ServletContext;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.context.ServletContextAware;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
    import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
    import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
    import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
    import com.tbtech.common.utils.StringUtils;
    import io.swagger.annotations.ApiOperation;
    
    @Service
    public class InitUrlService implements InitializingBean, ServletContextAware{
    	
    	public static List<HashMap<String, String>> urlList = new ArrayList<HashMap<String, String>>();  
    	
    	@Autowired
        private RequestMappingHandlerMapping requestMappingHandlerMapping;
    
    	/**
    	 *  获取url与类和方法的对应信息
    	 */
    	@Override
    	public void setServletContext(ServletContext servletContext) {
            Map<RequestMappingInfo, HandlerMethod> handlerMethodsMap = requestMappingHandlerMapping.getHandlerMethods();  
            for (Map.Entry<RequestMappingInfo, HandlerMethod> item : handlerMethodsMap.entrySet()) {
                HashMap<String, String> model = new HashMap<String, String>();  
                RequestMappingInfo info = item.getKey();  
                HandlerMethod method = item.getValue();  
                PatternsRequestCondition p = info.getPatternsCondition();  
                for (String url : p.getPatterns()) {
                	model.put("url", url);  //路径
                }  
                
                model.put("className", method.getMethod().getDeclaringClass().getName()); // 类名  
                
                ApiOperation apiOperation = method.getMethodAnnotation(ApiOperation.class);
                if(apiOperation != null) {
                	model.put("apiOperationValue", apiOperation.value()); //接口说明
                	model.put("apiOperationnotes", apiOperation.notes()); //接口发布说明
                }
             
                RequestMethodsRequestCondition methodsCondition = info.getMethodsCondition();  
                String type = methodsCondition.toString();  
                if (type != null && type.startsWith("[") && type.endsWith("]")) {  
                    type = type.substring(1, type.length() - 1);  
                    model.put("type", type); // 方法请求类型  
                }  
                urlList.add(model);  
            }
            
            System.out.println("----反向加载URL完成----");
    	}
    
    	@Override
    	public void afterPropertiesSet() throws Exception {
    		// TODO Auto-generated method stub
    		
    	}
    	
    	/**
    	 * 通过访问IP获取访问方法信息
    	 * @param lookupPath
    	 * @return
    	 */
    	public HashMap<String, String> findUrlByUrlList(String lookupPath){
    		for(HashMap<String, String> item : urlList) {
    			String url = item.getOrDefault("url", "");
    			if(!StringUtils.isBlank(url) && url.equals(lookupPath)) {
    				return item;
    			}
    		}
    		return null;
    	}
    
    }
    
    • 在插入操作记录的地方取出对应的url信息即可
    HashMap<String, String> urlItem = initUrlService.findUrlByUrlList(url);
    String apiOperationnotes = urlItem.getOrDefault("apiOperationnotes", "")
    

    .end

    展开全文
  • 获取指定包名下的所有类的全类名的解决方案转载至https://www.cnblogs.com/zeng1994/p/59313120e95e2074981870c787cd69d9.html import java.io.File; import java.io.IOException; import java.net....
  • /*** Scans all classes accessible from the context class loader which belong to the given package and subpackages.** @param packageName The base package* @return The classes* @throws ClassNotFoundExce...
  • java通过包名反射获取所有类名

    千次阅读 2019-05-09 15:30:45
    在编程中,始终有一些需求,需要获得一个... * 根据包名获取包下面所有类名 * * @param pack * @return * @throws Exception */ public static Set<Class<?>> getClasses(String pack) throws Ex...
  • importjava.lang.annotation.Annotation;importjava.util.HashSet;importjava.util.LinkedList;importjava.util.List;importjava.util.Set;public class ClassScaner implementsResourceLoaderAware {//保存过滤规则...
  • ------------------------------------------------------------------------------------------------------------------ App.java main AppFrame.java main componentHidden componentMoved componentResized ...
  • 21、Java注释和注解的区别这是两个不同的概念。注释:对代码的解释,方便别人阅读你的代码注释分为:单行注释 格式: // 注释文字多行注释 格式: /* 注释文字 */文档注释 格式:/** 注释文字 */注解:注解 ,参与...
  • 1、 动态的加载类、动态的获取类的信息(属性、方法、构造器)2、 动态调用构造器对象3、 动态调用类和对象的任意方法、构造器4、 动态调用和处理属性5、 获取泛型信息6、 处理注解(2) 获取Class对象的方式有哪些?...
  • 前言Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,但了解之后才知道有很多巧妙的设计在里面。如果不看Spring的源码,你将会失去一次和大师学习的机会:它的代码规范,设计思想很值得...
  • 1. 反射机制介绍_Class对象获取反射机制是 Java 的动态性之一 动态语言:在程序运行时,可以改变程序的结构或变量的 类型。反射机制的常见作用动态的加载类、动态的获取类的信息(属性,方法,构造 器) 动态构造对象 ...
  • Java获取指定包名下的所有类的全类名的解决方案
  • ConfMgr.class是获取ConfMgr的class对象,类型类指的是代表一个类型的类,因为一切皆是对象,几种获取class对象的方法:1,所有的引用数据类型(类-类型)的类名、基本数据类型都可以通过.class方式获取其 Class对象。...
  • 功能:根据包名获取包里面的所有类,返回完整类名的列表。 备注:经过测试 javajava-web 项目测试都能使用。 package com.wth.utils; import java.io.File; import java.net.URISyntaxException; import java...
  • 1 public static void getObjectValue(Object object) throwsException {2 //我们项目的所有实体类都继承BaseDomain (所有实体基类:该类只是串行化一下)3 //不需要的自己去掉即可4 if (object != null && ...
  • 1 public static void getObjectValue(Object object) throwsException {2 //我们项目的所有实体类都继承BaseDomain (所有实体基类:该类只是串行化一下)3 //不需要的自己去掉即可4 if (object != null && ...
  • 获取包下所有类名

    2013-04-28 00:25:00
    引用地址:... import java.io.File; import java.lang.reflect.Method; public class LoopApp { public static void main(String[] args) throws Exception { Stri...
  • package ...import java.io.File;import java.io.IOException;import java.net.JarURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.Enumeration;import jav...
  • #### 通过包名获得本包所有类名~~~/** @(#)PackageUtil.java 1.00 2006-11-27* 功能:* Copyright (c) 2005 Shenzhen Surfilter Network Technology Co.,Ltd. All rights reserved.*/package com.hngskj;import ...
  • 最近在项目中调用mybatis获取到了实体...2.根据类对象获取所有的对象方法名 3.根据方法名调用方法。 *解决第一个问题代码: String className = object.getClass().toString();#结果如‘class com.hongtu.datapo...
  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(类名,方法名,参数类型,返回值类型);对于任意一个对象,都能够调用它任意的一个方法和属性;这种动态获取的信息以及动态调用...
  • 提供个根据包路径,获取包下面所有类名的方法,参考链接:https://www.cnblogs.com/rinack/p/7606289.html import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.util....
  • 已知一个类名,通过类名获取这个类中的所有方法和方法的参数类型 1、新建两个java文件Customer.java和TestReflect.java 结果:方法中有参数的会指明参数类型,没有参数的不会输出 方法setName的参数类型是java....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 637
精华内容 254
关键字:

java获取所有类名

java 订阅