ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

通过反射实例化与当前类所在的同一个包中的所有类、包扫描实现原理

2022-09-11 23:34:21  阅读:208  来源: 互联网

标签:包中 Test2 String 扫描 method className 实例 File class


实例化与当前类Test2在同一个包中的所有类

思路:
1:首先定位Test2的字节码文件所在的目录(main方法里第一行代码)
2:通过该目录获取里面所有的.class文件
3:由于字节码文件名与类名一致(JAVA语法要求),因此可以通过文件名确定类名
4:使用Class.forName()加载对应的类并实例化

上述完成后,自动调用这些类中所有的无参且公开的方法(本类定义的方法)。

package reflect;

import java.io.File;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 实例化与当前类Test2在同一个包中的所有类
 * 思路:
 * 1:首先定位Test2的字节码文件所在的目录(main方法里第一行代码)
 * 2:通过该目录获取里面所有的.class文件
 * 3:由于字节码文件名与类名一致(JAVA语法要求),因此可以通过文件名确定类名
 * 4:使用Class.forName()加载对应的类并实例化
 *
 * 上述完成后,自动调用这些类中所有的无参且公开的方法(本类定义的方法)。
 *
 */
public class Test2 {
    public static void main(String[] args) throws Exception {
        File dir = new File(
            Test2.class.getResource(".").toURI()
        );
        System.out.println(dir);
        //添加过滤器获取该目录中的所有字节码文件
        //listFiles()获取当前目录中所有文件
        File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));
        for(File sub : subs){
            String fileName = sub.getName();
            String className = fileName.substring(0,fileName.lastIndexOf("."));
//            String className = fileName.replace(".class","");
            String packName = Test2.class.getPackage().getName();
            className = packName+"."+className;
            Class cls = Class.forName(className);
            Object obj = cls.newInstance();
            System.out.println(obj);

            Method[] methods = cls.getDeclaredMethods();
            for(Method method : methods){
                //判断是否为无参数方法
                if(method.getParameterCount()==0 &&
                        method.getModifiers()== Modifier.PUBLIC //是否为公开方法
                ){
                    System.out.println("调用方法:"+method.getName()+"()");
                    method.invoke(obj);
                }
            }

        }

    }
}

收获总结:由此可见反射可以做到对包的类扫描、对类的方法扫描。
联想:这让我想到了Spring的配置包扫描Bean应该也是和个道理。

标签:包中,Test2,String,扫描,method,className,实例,File,class
来源: https://www.cnblogs.com/little-monster-lhq/p/16685100.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有