精华内容
下载资源
问答
  • 主要介绍了java获取包下被指定注解的类过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Java获取包中的所有类

    千次阅读 2019-05-27 10:17:58
    Java获取包中的所有类 package com.zhiyu.utils; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net....

    Java获取包中的所有类

    package com.zhiyu.utils;
    import java.io.File;
    import java.io.FileFilter;
    import java.io.IOException;
    import java.net.JarURLConnection;
    import java.net.URL;
    import java.net.URLDecoder;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
    
    public class ClasstUtils {
    
    	
    	public static void main(String[] args) {
    		List<Class<?>> classes = getClasses("com.zhiyu.utils");
    		for (Class<?> class1 : classes) {
    			System.out.println(class1);
    		}
    	}
    	
    	public static List<Class<?>> getClasses(String packageName){ 
            //第一个class类的集合  
            List<Class<?>> classes = new ArrayList<Class<?>>();  
            //是否循环迭代  
            boolean recursive = true;  
            //获取包的名字 并进行替换  
            String packageDirName = packageName.replace('.', '/');  
            //定义一个枚举的集合 并进行循环来处理这个目录下的things  
            Enumeration<URL> dirs;  
            try {  
                dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);  
                //循环迭代下去  
                while (dirs.hasMoreElements()){  
                    //获取下一个元素  
                    URL url = dirs.nextElement();  
                    //得到协议的名称  
                    String protocol = url.getProtocol();  
                    //如果是以文件的形式保存在服务器上  
                    if ("file".equals(protocol)) {  
                        //获取包的物理路径  
                        String filePath = URLDecoder.decode(url.getFile(), "UTF-8");  
                        //以文件的方式扫描整个包下的文件 并添加到集合中  
                        findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);  
                    } else if ("jar".equals(protocol)){  
                        //如果是jar包文件   
                        //定义一个JarFile  
                        JarFile jar;  
                        try {  
                            //获取jar  
                            jar = ((JarURLConnection) url.openConnection()).getJarFile();  
                            //从此jar包 得到一个枚举类  
                            Enumeration<JarEntry> entries = jar.entries();  
                            //同样的进行循环迭代  
                            while (entries.hasMoreElements()) {  
                                //获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件  
                                JarEntry entry = entries.nextElement();  
                                String name = entry.getName();  
                                //如果是以/开头的  
                                if (name.charAt(0) == '/') {  
                                    //获取后面的字符串  
                                    name = name.substring(1);  
                                }  
                                //如果前半部分和定义的包名相同  
                                if (name.startsWith(packageDirName)) {  
                                    int idx = name.lastIndexOf('/');  
                                    //如果以"/"结尾 是一个包  
                                    if (idx != -1) {  
                                        //获取包名 把"/"替换成"."  
                                        packageName = name.substring(0, idx).replace('/', '.');  
                                    }  
                                    //如果可以迭代下去 并且是一个包  
                                    if ((idx != -1) || recursive){  
                                        //如果是一个.class文件 而且不是目录  
                                        if (name.endsWith(".class") && !entry.isDirectory()) {  
                                            //去掉后面的".class" 获取真正的类名  
                                            String className = name.substring(packageName.length() + 1, name.length() - 6);  
                                            try {  
                                                //添加到classes  
                                                classes.add(Class.forName(packageName + '.' + className));  
                                            } catch (ClassNotFoundException e) {  
                                                e.printStackTrace();  
                                            }  
                                          }  
                                    }  
                                }  
                            }  
                        } catch (IOException e) {  
                            e.printStackTrace();  
                        }   
                    }  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
             
            return classes;  
        }  
    	
    	  public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, List<Class<?>> classes){  
    	        //获取此包的目录 建立一个File  
    	        File dir = new File(packagePath);  
    	        //如果不存在或者 也不是目录就直接返回  
    	        if (!dir.exists() || !dir.isDirectory()) {  
    	            return;  
    	        }  
    	        //如果存在 就获取包下的所有文件 包括目录  
    	        File[] dirfiles = dir.listFiles(new FileFilter() {  
    	        //自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)  
    	              public boolean accept(File file) {  
    	                return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));  
    	              }  
    	            });  
    	        //循环所有文件  
    	        for (File file : dirfiles) {  
    	            //如果是目录 则继续扫描  
    	            if (file.isDirectory()) {  
    	                findAndAddClassesInPackageByFile(packageName + "." + file.getName(),  
    	                                      file.getAbsolutePath(),  
    	                                      recursive,  
    	                                      classes);  
    	            }  
    	            else {  
    	                //如果是java类文件 去掉后面的.class 只留下类名  
    	                String className = file.getName().substring(0, file.getName().length() - 6);  
    	                try {  
    	                    //添加到集合中去  
    	                    classes.add(Class.forName(packageName + '.' + className));  
    	                } catch (ClassNotFoundException e) {  
    	                    e.printStackTrace();  
    	                }  
    	            }  
    	        }  
    	    }  
    	
    }
    
    展开全文
  • importjava.io.File;importjava.io.FileFilter;importjava.io.IOException;importjava.net.JarURLConnection;importjava.net.URL;importjava.net.URLDecoder;importjava.util.Enumeration;im...

    packagecom.s.rest.util;importjava.io.File;importjava.io.FileFilter;importjava.io.IOException;importjava.net.JarURLConnection;importjava.net.URL;importjava.net.URLDecoder;importjava.util.Enumeration;importjava.util.LinkedHashSet;importjava.util.Set;importjava.util.jar.JarEntry;importjava.util.jar.JarFile;/*** 扫描2包下的所有类

    *

    Title: ClassUtil.java

    *

    Description:

    *@authorlichao1

    * @date 2018年12月3日

    *@version1.0*/

    public classClassUtil {private static Set>classList;static{

    classList= getClasses("com.esri.rest");

    }/*** 从包package中获取所有的Class

    *

    *@parampack

    *@return

    */

    public static Set>getClasses(String pack) {//第一个class类的集合

    Set> classes = new LinkedHashSet>();//是否循环迭代

    boolean recursive = true;//获取包的名字 并进行替换

    String packageName =pack;

    String packageDirName= packageName.replace('.', '/');//定义一个枚举的集合 并进行循环来处理这个目录下的things

    Enumerationdirs;try{

    dirs=Thread.currentThread().getContextClassLoader().getResources(packageDirName);//循环迭代下去

    while(dirs.hasMoreElements()) {//获取下一个元素

    URL url =dirs.nextElement();//得到协议的名称

    String protocol =url.getProtocol();//如果是以文件的形式保存在服务器上

    if ("file".equals(protocol)) {//System.err.println("file类型的扫描");//获取包的物理路径

    String filePath = URLDecoder.decode(url.getFile(), "UTF-8");//以文件的方式扫描整个包下的文件 并添加到集合中

    findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);

    }else if ("jar".equals(protocol)) {//如果是jar包文件//定义一个JarFile//System.err.println("jar类型的扫描");

    JarFile jar;try{//获取jar

    jar =((JarURLConnection) url.openConnection()).getJarFile();//从此jar包 得到一个枚举类

    Enumeration entries =jar.entries();//同样的进行循环迭代

    while(entries.hasMoreElements()) {//获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件

    JarEntry entry =entries.nextElement();

    String name=entry.getName();//如果是以/开头的

    if (name.charAt(0) == '/') {//获取后面的字符串

    name = name.substring(1);

    }//如果前半部分和定义的包名相同

    if(name.startsWith(packageDirName)) {int idx = name.lastIndexOf('/');//如果以"/"结尾 是一个包

    if (idx != -1) {//获取包名 把"/"替换成"."

    packageName = name.substring(0, idx).replace('/', '.');

    }//如果可以迭代下去 并且是一个包

    if ((idx != -1) ||recursive) {//如果是一个.class文件 而且不是目录

    if (name.endsWith(".class") && !entry.isDirectory()) {//去掉后面的".class" 获取真正的类名

    String className = name.substring(packageName.length() + 1, name.length() - 6);try{//添加到classes

    classes.add(Class.forName(packageName + '.' +className));

    }catch(ClassNotFoundException e) {//log//.error("添加用户自定义视图类错误//找不到此类的.class文件");

    e.printStackTrace();

    }

    }

    }

    }

    }

    }catch(IOException e) {//log.error("在扫描用户定义视图时从jar包获取文件出错");

    e.printStackTrace();

    }

    }

    }

    }catch(IOException e) {

    e.printStackTrace();

    }returnclasses;

    }/*** 以文件的形式来获取包下的所有Class

    *

    *@parampackageName

    *@parampackagePath

    *@paramrecursive

    *@paramclasses*/

    public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final booleanrecursive,

    Set>classes) {//获取此包的目录 建立一个File

    File dir = newFile(packagePath);//如果不存在或者 也不是目录就直接返回

    if (!dir.exists() || !dir.isDirectory()) {//log.warn("用户定义包名 " + packageName + " 下没有任何文件");

    return;

    }//如果存在 就获取包下的所有文件 包括目录

    File[] dirfiles = dir.listFiles(newFileFilter() {//自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)

    public booleanaccept(File file) {return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));

    }

    });//循环所有文件

    for(File file : dirfiles) {//如果是目录 则继续扫描

    if(file.isDirectory()) {

    findAndAddClassesInPackageByFile(packageName+ "." +file.getName(), file.getAbsolutePath(), recursive,

    classes);

    }else{//如果是java类文件 去掉后面的.class 只留下类名

    String className = file.getName().substring(0, file.getName().length() - 6);try{//添加到集合中去//classes.add(Class.forName(packageName + '.' +//className));//经过回复同学的提醒,这里用forName有一些不好,会触发static方法,没有使用classLoader的load干净

    classes.add(

    Thread.currentThread().getContextClassLoader().loadClass(packageName+ '.' +className));

    }catch(ClassNotFoundException e) {//log.error("添加用户自定义视图类错误 找不到此类的.class文件");

    e.printStackTrace();

    }

    }

    }

    }public static voidmain(String[] args) {

    System.out.println(classList);

    Object[] ts=classList.toArray();for(Object t:ts){

    Class> tt = (Class>) t;

    System.out.println(tt.getName());

    }

    }

    }

    展开全文
  • 1. 引三方org.reflectionsreflections0.9.112. 代码//反射工具,指明扫描路径Reflections reflections = new Reflections(...//获取带Handler注解的类Set> classList = reflections.getTypesAnnotate...

    1. 引三方包

    org.reflections

    reflections

    0.9.11

    2. 代码

    //反射工具包,指明扫描路径

    Reflections reflections = new Reflections("cn.qdgd.center.base.service.impl");

    //获取带Handler注解的类

    Set> classList = reflections.getTypesAnnotatedWith(BpsService.class);

    Date now = new Date();

    // 根据自己场景书写其他代码。。。

    3. 部分用法

    // 初始化工具类

    Reflections reflections = new Reflections(new ConfigurationBuilder().forPackages(basePackages).addScanners(new SubTypesScanner()).addScanners(new FieldAnnotationsScanner()));

    // 获取某个包下类型注解对应的类

    Set> typeClass = reflections.getTypesAnnotatedWith(RpcInterface.class, true);

    // 获取子类

    Set> subTypes = reflections.getSubTypesOf(SomeType.class);

    // 获取注解对应的方法

    Set resources =reflections.getMethodsAnnotatedWith(SomeAnnotation.class);

    // 获取注解对应的字段

    Set ids = reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);

    // 获取特定参数对应的方法

    Set someMethods = reflections.getMethodsMatchParams(long.class, int.class);

    Set voidMethods = reflections.getMethodsReturn(void.class);

    Set pathParamMethods =reflections.getMethodsWithAnyParamAnnotated(PathParam.class);

    // 获取资源文件

    Set properties = reflections.getResources(Pattern.compile(".*\\.properties"));

    4. 部分使用场景

    1)获取某个类型的所有子类;比如,有一个父类是TestInterface,可以获取到TestInterface的所有子类。

    2)获取某个注解的所有类型/字段变量,支持注解参数匹配。

    3)使用正则表达式获取所有匹配的资源文件

    4)获取特定签名方法。

    展开全文
  • packagecom.threeti....importjava.io.File;importjava.io.FileFilter;importjava.io.IOException;importjava.net.JarURLConnection;importjava.net.URL;importjava.net.URLDecoder;importjava.util.ArrayList;imp...

    packagecom.threeti.util;importjava.io.File;importjava.io.FileFilter;importjava.io.IOException;importjava.net.JarURLConnection;importjava.net.URL;importjava.net.URLDecoder;importjava.util.ArrayList;importjava.util.Enumeration;importjava.util.LinkedHashSet;importjava.util.List;importjava.util.Set;importjava.util.jar.JarEntry;importjava.util.jar.JarFile;/*** 类相关的工具类

    *

    *@authorohergal

    **/

    public classClassUtil {public static void main(String[] args) throwsException{

    List classes = ClassUtil.getAllClassByInterface(Class.forName("com.threeti.dao.base.IGenericDao"));for(Class clas :classes) {

    System.out.println(clas.getName());

    }

    }/*** 取得某个接口下所有实现这个接口的类

    **/public static ListgetAllClassByInterface(Class c) {

    List  returnClassList = null;if(c.isInterface()) {//获取当前的包名

    String packageName =c.getPackage().getName();//获取当前包下以及子包下所以的类

    List> allClass =getClasses(packageName);if(allClass != null) {

    returnClassList= new ArrayList();for(Class classes : allClass) {//判断是否是同一个接口

    if(c.isAssignableFrom(classes)) {//本身不加入进去

    if(!c.equals(classes)) {

    returnClassList.add(classes);

    }

    }

    }

    }

    }returnreturnClassList;

    }/** 取得某一类所在包的所有类名 不含迭代*/public staticString[] getPackageAllClassName(String classLocation, String packageName){//将packageName分解

    String[] packagePathSplit = packageName.split("[.]");

    String realClassLocation=classLocation;int packageLength =packagePathSplit.length;for(int i = 0; i< packageLength; i++){

    realClassLocation= realClassLocation + File.separator+packagePathSplit[i];

    }

    File packeageDir= newFile(realClassLocation);if(packeageDir.isDirectory()){

    String[] allClassName=packeageDir.list();returnallClassName;

    }return null;

    }/*** 从包package中获取所有的Class

    *@parampack

    *@return*/public static List>getClasses(String packageName){//第一个class类的集合

    List> classes = new ArrayList>();//是否循环迭代

    boolean recursive = true;//获取包的名字 并进行替换

    String packageDirName = packageName.replace('.', '/');//定义一个枚举的集合 并进行循环来处理这个目录下的things

    Enumerationdirs;try{

    dirs=Thread.currentThread().getContextClassLoader().getResources(packageDirName);//循环迭代下去

    while(dirs.hasMoreElements()){//获取下一个元素

    URL url =dirs.nextElement();//得到协议的名称

    String protocol =url.getProtocol();//如果是以文件的形式保存在服务器上

    if ("file".equals(protocol)) {//获取包的物理路径

    String filePath = URLDecoder.decode(url.getFile(), "UTF-8");//以文件的方式扫描整个包下的文件 并添加到集合中

    findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);

    }else if ("jar".equals(protocol)){//如果是jar包文件//定义一个JarFile

    JarFile jar;try{//获取jar

    jar =((JarURLConnection) url.openConnection()).getJarFile();//从此jar包 得到一个枚举类

    Enumeration entries =jar.entries();//同样的进行循环迭代

    while(entries.hasMoreElements()) {//获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件

    JarEntry entry =entries.nextElement();

    String name=entry.getName();//如果是以/开头的

    if (name.charAt(0) == '/') {//获取后面的字符串

    name = name.substring(1);

    }//如果前半部分和定义的包名相同

    if(name.startsWith(packageDirName)) {int idx = name.lastIndexOf('/');//如果以"/"结尾 是一个包

    if (idx != -1) {//获取包名 把"/"替换成"."

    packageName = name.substring(0, idx).replace('/', '.');

    }//如果可以迭代下去 并且是一个包

    if ((idx != -1) ||recursive){//如果是一个.class文件 而且不是目录

    if (name.endsWith(".class") && !entry.isDirectory()) {//去掉后面的".class" 获取真正的类名

    String className = name.substring(packageName.length() + 1, name.length() - 6);try{//添加到classes

    classes.add(Class.forName(packageName + '.' +className));

    }catch(ClassNotFoundException e) {

    e.printStackTrace();

    }

    }

    }

    }

    }

    }catch(IOException e) {

    e.printStackTrace();

    }

    }

    }

    }catch(IOException e) {

    e.printStackTrace();

    }returnclasses;

    }/*** 以文件的形式来获取包下的所有Class

    *@parampackageName

    *@parampackagePath

    *@paramrecursive

    *@paramclasses*/public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, List>classes){//获取此包的目录 建立一个File

    File dir = newFile(packagePath);//如果不存在或者 也不是目录就直接返回

    if (!dir.exists() || !dir.isDirectory()) {return;

    }//如果存在 就获取包下的所有文件 包括目录

    File[] dirfiles = dir.listFiles(newFileFilter() {//自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)

    public booleanaccept(File file) {return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));

    }

    });//循环所有文件

    for(File file : dirfiles) {//如果是目录 则继续扫描

    if(file.isDirectory()) {

    findAndAddClassesInPackageByFile(packageName+ "." +file.getName(),

    file.getAbsolutePath(),

    recursive,

    classes);

    }else{//如果是java类文件 去掉后面的.class 只留下类名

    String className = file.getName().substring(0, file.getName().length() - 6);try{//添加到集合中去

    classes.add(Class.forName(packageName + '.' +className));

    }catch(ClassNotFoundException e) {

    e.printStackTrace();

    }

    }

    }

    }

    }

    展开全文
  • Java 获取包

    千次阅读 2020-05-11 09:59:44
    public String getPackName() { Package pack = getClass().getPackage(); String packName = pack.getName(); do{ packName = packName.substring(0,packName.lastIndexOf(".")); pack = Package.get...
  • 我有代码 private static class MyVisitor extends VoidVisitorAdapter { @...将显示对象//类名.但是如何获得它的类型? 例如代码System.out.println(“Hello world”); 应该输出 Type: java.io.PrintStream
  • jarEntries = jarFile.entries();while (jarEntries.hasMoreElements()) {JarEntry jarEntry = jarEntries.nextElement();String jarEntryName = jarEntry.getName();if (jarEntryName.endsWith(".class")) {String ...
  • java获取包内所有类

    2019-11-07 19:32:03
    // 获取特定下所有的类 List<Class<?>> clsList = ClassUtil.getClasses("cn.gtmap.xxx.entity"); import java.io.File; import java.io.FileFilter; import java.io.IOException; import java...
  • /*** 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...
  • importjava.lang.annotation.Annotation;importjava.util.HashSet;importjava.util.LinkedList;importjava.util.List;importjava.util.Set;public class ClassScaner implementsResourceLoaderAware {//保存过滤规则...
  • packageName为名 eg:“com.test.demo” public List<String> classCache = new ArrayList<>(); public void doRegister(String packageName){ URL url = this.getClass().getClassLoader().g...
  • Java获取包或jar下面的所有class文件

    千次阅读 2018-07-23 22:34:05
    import java.io.File; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.*; import java.util.jar.JarEntry; import java.u...
  • Java 获取包下的所有类

    千次阅读 2017-03-01 15:36:39
    import java.io.File; import java.io.IOException; import java.net.JarURLConnection; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; import java.
  • java获取包下面的自定义注解

    千次阅读 2016-10-05 17:28:24
    (2)annotation下面自定义了两个注解。 Controller.java package com.huawi.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.a
  • JAVA获取包下的类

    2015-02-01 13:18:40
    我借用上面博客中的代码,把重点放在从file类型中获取类名,并增加了获取包含指定注解的类名的功能 代码获取的类名是诸如com.meso.nio.NIOClient这样的格式,可以直接运用于Class.forName(className)函数 ...
  • 1获取包下面properties文件内容 Properties properties = new Properties(); InputStream inputStream = Object.class.getResourceAsStream("/code.properties"); try { properties.load(inputSt...
  • Java 获取包路径的小技巧

    千次阅读 2018-03-05 16:42:31
    /** 项目在硬盘上的基础路径 */ private static final String PROJECT_PATH = System..../** 获取当前类的路径 com.example.CodeGenerator.core*/ private static String packAge = ProjectConstant.class.getPack...
  • public static Class[] getClasses(String pckgname)throws ClassNotFoundException {ArrayList classes = new ArrayList();// Get a File object for the packageFile directory = null;try {ClassLoader cld = Thr...
  • java获取包下被指定注解的类

    千次阅读 2019-12-31 16:58:18
    // 获取包的名字 并进行替换 String packageDirName = packageName.replace('.', '/'); // 定义一个枚举的集合 并进行循环来处理这个目录下的things Enumeration<URL> dirs; try { dirs = Thread.current...
  • java获取包或jar下面的所有class文件

    千次阅读 2016-08-15 14:52:14
    import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.Enumeration; i
  • java 获取打包成exe后的exe程序路径

    千次阅读 2016-05-16 13:47:19
    本人通过lanuch4j将jar打包成exe,通过launch4j的配置,可以获取exe文件的路径:具体设置如图 JOptionPane.showMessageDialog(frame, System.getProperty("launch4j.exefile"));
  • ------------------------------------------------------------------------------------------------------------------ App.java main AppFrame.java main componentHidden componentMoved componentResized ...
  • java获取下所有类

    2020-06-21 13:23:57
    java 获取包路径下的所有类 /** * 获取某包下所有类 * * @param packageName 包名 * @param isRecursion 是否遍历子包 * @return 类的完整名称 */ public static Set<String> getClassName(String ...
  • public class JarUtil{private String jarName;private String jarPath;public JarUtil(Class clazz){String path = clazz.getProtectionDomain().getCodeSource().getLocation().getFile...try{path = java.net.URL...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,285
精华内容 8,514
关键字:

java获取包

java 订阅