{"id":14637930,"url":"https://github.com/luelueking/ClazzSearcher","last_synced_at":"2025-09-07T06:31:22.500Z","repository":{"id":184781235,"uuid":"672465149","full_name":"luelueking/ClazzSearcher","owner":"luelueking","description":"一款使用Yaml定义搜索规则来搜索Class的工具","archived":false,"fork":false,"pushed_at":"2023-08-02T01:34:56.000Z","size":88,"stargazers_count":105,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-26T23:12:19.690Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luelueking.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-07-30T07:12:28.000Z","updated_at":"2024-12-25T17:02:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"8aeecca1-bc07-4ed8-8145-0b7e9a4334ae","html_url":"https://github.com/luelueking/ClazzSearcher","commit_stats":null,"previous_names":["luelueking/clazzsearcher"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luelueking%2FClazzSearcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luelueking%2FClazzSearcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luelueking%2FClazzSearcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luelueking%2FClazzSearcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luelueking","download_url":"https://codeload.github.com/luelueking/ClazzSearcher/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":232183019,"owners_count":18484722,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-10T02:01:24.174Z","updated_at":"2025-01-02T10:31:08.627Z","avatar_url":"https://github.com/luelueking.png","language":"Java","funding_links":[],"categories":["Java","类路径扫描"],"sub_categories":["文件同步"],"readme":"# ClazzSearcher\n一款使用Yaml定义搜索规则来搜索Class的工具\n### Quick Start(快速开始)\n```shell\n# 搜索jar包\njava -jar ClazzSearcher.jar --f example.yml --boot d3forest-1.0-SNAPSHOT.jar\n# 搜索目录\njava -jar ClazzSearcher.jar --f example.yml --boot target/dir/lib\n# 使用缓存\njava -jar ClazzSearcher.jar --resume --f example.yml ....\n```\n下面是yml的规则搜索模版(如果不需要引入某条rule则不写)\n```yaml\nname: \"targetName\" # target的类名，支持正则，例如\".*ServiceImpl$\"\nisInterface: false     # target是不是接口，true:是\nextendsList:           # target继承的父类，有多个，因为接口可以有多个父接口\n  - java.lang.Object\nimplementsList:        # target实现的接口，例如\"java/io/Serializable\"\n  - interface1\n  - interface2\nannotations:           # target上存在的注解，例如\"Lorg/springframework/web/bind/annotation/RestController;\"\n  - annotation1\n  - annotation2\nfields:                # target所有的field属性，field之间为与逻辑\n  - {\n    \"name\": \"request\", # field的name\n    \"access\": 2,       # field的访问access\n    \"type\": \"type1\"    # field的class类型，例如\"org/springframework/http/server/reactive/ServerHttpRequest\"\n  }\n  - {\n    \"name\": \"field2\",\n    \"access\": 1,\n    \"type\": \"type2\"\n  }\nmethods:               # target所拥有的method方法\n  - {\n    \"name\": \"m1\",      # method的name，例如\"excludeMBeanIfNecessary\"\n    \"desc\": \"desc1\",   # method的描述符，例如\"(Ljava/lang/Object;)V\"\n    \"access\": \"public\", # method的访问修饰符\n    \"isStatic\": false, # method是否是静态方法\n    \"calls\": [         # method中调用了哪些方法, calls之间为或逻辑\n      {\n        \"classRef\": \"org/springframework/jmx/export/MBeanExporter\", # 被调用方法的类\n        \"name\": \"addExcludedBean\",                                  # 被调用方法的名\n        \"desc\": \"(Ljava/lang/String;)V\"                             # 被调用方法的方法描述\n      }\n    ]\n  }\n  - {\n    \"name\": \"m2\",\n    \"desc\": \"(Ljava/io/Reader;)Ljava/lang/Object;\",\n    \"access\": \"private\",\n    \"call\" : [\n      { },{ },...\n    ]\n  }\n\n```\n### Use Case(使用案例)\n例如下面一段规则\n```yaml\nimplementsList:\n  - org/springframework/beans/PropertyValues\n  - java/io/Serializable\nextendsList:\n  - org/springframework/beans/MutablePropertyValues\n```\n运行`ClazzSearchApplication`加上参数`--f example.yml --boot d3forest-1.0-SNAPSHOT.jar`\n```\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有方法信息完毕\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有类信息完毕\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有父子类、超类、实现类关系\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载方法调用信息完毕\n[main] INFO org.vidar.discovery.ClazzDiscovery - 开始寻找目标类...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 你所寻找的class实现的接口有：\n[main] INFO org.vidar.discovery.ClazzDiscovery - org/springframework/beans/PropertyValues\n[main] INFO org.vidar.discovery.ClazzDiscovery - java/io/Serializable\n[main] INFO org.vidar.discovery.ClazzDiscovery - 你所寻找的class继承的类有：\n[main] INFO org.vidar.discovery.ClazzDiscovery - org/springframework/beans/MutablePropertyValues\n找到一个类：ClassReference.Handle(name=org/springframework/web/bind/ServletRequestParameterPropertyValues)\n找到一个类：ClassReference.Handle(name=org/springframework/web/filter/GenericFilterBean$FilterConfigPropertyValues)\n找到一个类：ClassReference.Handle(name=org/springframework/web/servlet/HttpServletBean$ServletConfigPropertyValues)\n```\n\n如有下面这段规则\n```yaml\nmethods:\n  - {\n    \"name\": \"excludeMBeanIfNecessary\",\n    \"desc\": \"(Ljava/lang/Object;Ljava/lang/String;Lorg/springframework/context/ApplicationContext;)V\",\n    \"access\": \"private\",\n    \"isStatic\": false,\n    \"calls\": [\n      {\n        \"classRef\": \"org/springframework/jmx/export/MBeanExporter\",\n        \"name\": \"addExcludedBean\",\n        \"desc\": \"(Ljava/lang/String;)V\"\n      }\n    ]\n  }\n```\n运行`ClazzSearchApplication`加上参数`--f example.yml --boot d3forest-1.0-SNAPSHOT.jar`\n```\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有方法信息完毕\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有类信息完毕\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有父子类、超类、实现类关系\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载方法调用信息完毕\n[main] INFO org.vidar.discovery.ClazzDiscovery - 开始寻找目标类...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 你希望target中存在：ClazzRule.Method(clazz=null, name=excludeMBeanIfNecessary, desc=(Ljava/lang/Object;Ljava/lang/String;Lorg/springframework/context/ApplicationContext;)V, access=private, isStatic=false, calls=[ClazzRule.Call(classRef=org/springframework/jmx/export/MBeanExporter, name=addExcludedBean, desc=(Ljava/lang/String;)V)])方法\n找到一个类：ClassReference.Handle(name=org/springframework/boot/autoconfigure/jdbc/JndiDataSourceAutoConfiguration)\n```\n### 实战例子\n#### 寻找一些lookup的sink点\n``` yaml\nmethods:\n  - {\n    \"name\": \"connect\",\n    \"calls\": [\n      {\n        \"classRef\": \"javax/naming/Context\",\n        \"name\": \"lookup\"\n      },\n      {\n        \"classRef\": \"javax/naming/InitialContext\",\n        \"name\": \"lookup\"\n      }\n    ]\n  }\n```\n运行结果\n```\n\n ______  __      ______  ______  ______       ______  ______  ______  ______  ______  __  __  ______  ______    \n/\\  ___\\/\\ \\    /\\  __ \\/\\___  \\/\\___  \\     /\\  ___\\/\\  ___\\/\\  __ \\/\\  == \\/\\  ___\\/\\ \\_\\ \\/\\  ___\\/\\  == \\   \n\\ \\ \\___\\ \\ \\___\\ \\  __ \\/_/  /_\\/_/  /__    \\ \\___  \\ \\  __\\\\ \\  __ \\ \\  __\u003c\\ \\ \\___\\ \\  __ \\ \\  __\\\\ \\  __\u003c   \n \\ \\_____\\ \\_____\\ \\_\\ \\_\\/\\_____\\/\\_____\\    \\/\\_____\\ \\_____\\ \\_\\ \\_\\ \\_\\ \\_\\ \\_____\\ \\_\\ \\_\\ \\_____\\ \\_\\ \\_\\ \n  \\/_____/\\/_____/\\/_/\\/_/\\/_____/\\/_____/     \\/_____/\\/_____/\\/_/\\/_/\\/_/ /_/\\/_____/\\/_/\\/_/\\/_____/\\/_/ /_/ \n                                                                                                                \n[main] INFO org.vidar.ClazzSearchApplication - Using JAR classpath: /Users/zhchen/Downloads/github-workspace/d3forest/target/d3forest-1.0-SNAPSHOT.jar\n[main] INFO org.vidar.ClazzSearchApplication - Running method discovery...\n[main] INFO org.vidar.data.InheritanceDeriver - Calculating inheritance for 46001 classes...\n[main] INFO org.vidar.ClazzSearchApplication - Searching target class for yml ...\nClazzRule(name=null, isInterface=null, extendsList=null, implementsList=null, annotations=null, fields=null, methods=[ClazzRule.Method(clazz=null, name=connect, desc=null, access=null, isStatic=null, calls=[ClazzRule.Call(classRef=javax/naming/Context, name=lookup, desc=null), ClazzRule.Call(classRef=javax/naming/InitialContext, name=lookup, desc=null)])])\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有方法信息完毕...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有类信息完毕...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有父子类、超类、实现类关系完毕...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载方法调用信息完毕...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 开始寻找目标类...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 你希望target中存在：ClazzRule.Method(clazz=null, name=connect, desc=null, access=null, isStatic=null, calls=[ClazzRule.Call(claavax/naming/Context, name=lookup, desc=null), ClazzRule.Call(classRef=javax/naming/InitialContext, name=lookup, desc=null)])方法\n以下是搜索结果：\nClassReference.Handle(name=com/sun/rowset/internal/CachedRowSetReader)\nClassReference.Handle(name=com/sun/rowset/JdbcRowSetImpl)\n```\n#### 利用注解来寻找jar中的一些路由\n```yaml\nannotations:\n  - \"Lorg/springframework/web/bind/annotation/RestController;\"\n  - \"Lorg/springframework/stereotype/Controller;\"\n```\n结果\n```\n ______  __      ______  ______  ______       ______  ______  ______  ______  ______  __  __  ______  ______    \n/\\  ___\\/\\ \\    /\\  __ \\/\\___  \\/\\___  \\     /\\  ___\\/\\  ___\\/\\  __ \\/\\  == \\/\\  ___\\/\\ \\_\\ \\/\\  ___\\/\\  == \\   \n\\ \\ \\___\\ \\ \\___\\ \\  __ \\/_/  /_\\/_/  /__    \\ \\___  \\ \\  __\\\\ \\  __ \\ \\  __\u003c\\ \\ \\___\\ \\  __ \\ \\  __\\\\ \\  __\u003c   \n \\ \\_____\\ \\_____\\ \\_\\ \\_\\/\\_____\\/\\_____\\    \\/\\_____\\ \\_____\\ \\_\\ \\_\\ \\_\\ \\_\\ \\_____\\ \\_\\ \\_\\ \\_____\\ \\_\\ \\_\\ \n  \\/_____/\\/_____/\\/_/\\/_/\\/_____/\\/_____/     \\/_____/\\/_____/\\/_/\\/_/\\/_/ /_/\\/_____/\\/_/\\/_/\\/_____/\\/_/ /_/ \n                                                                                                                \n[main] INFO org.vidar.ClazzSearchApplication - Using JAR classpath: /Users/zhchen/Downloads/github-workspace/d3forest/target/d3forest-1.0-SNAPSHOT.jar\n[main] INFO org.vidar.ClazzSearchApplication - Running method discovery...\n[main] INFO org.vidar.data.InheritanceDeriver - Calculating inheritance for 46001 classes...\n[main] INFO org.vidar.ClazzSearchApplication - Searching target class for yml ...\nClazzRule(name=null, isInterface=null, extendsList=null, implementsList=null, annotations=[Lorg/springframework/web/bind/annotation/RestController;, Lorg/springframework/stereotype/Controller;], fields=null, methods=[ClazzRule.Method(clazz=null, name=hello, desc=null, access=null, isStatic=null, calls=null)])\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有方法信息完毕...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有类信息完毕...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载所有父子类、超类、实现类关系完毕...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 加载方法调用信息完毕...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 开始寻找目标类...\n[main] INFO org.vidar.discovery.ClazzDiscovery - 你希望target中存在：ClazzRule.Method(clazz=null, name=hello, desc=null, access=null, isStatic=null, calls=null)方法\n以下是搜索结果：\nClassReference.Handle(name=com/d3ctf/controller/HelloController)\n```\n### 参数说明\n- --resume 是否使用已建立的数据缓存\n- --f 指定配置yml\n- --onlyJDK 是否只在jdk中筛选\n- --boot 是否是springboot的jar\n### 附录\n#### field access计算表\n| 访问修饰符 | 数值表示 |\n| --------- | ------- |\n| ACC_PUBLIC | 1       |\n| ACC_PRIVATE | 2      |\n| ACC_PROTECTED | 4    |\n| ACC_STATIC | 8       |\n| ACC_FINAL | 16       |\n| ACC_VOLATILE | 64    |\n| ACC_TRANSIENT | 128  |\n| ACC_SYNTHETIC | 4096 |\n### TODO List\n- [x] 正则查询匹配\n- [ ] 更友好的字符格式\n- [ ] 交互式查询\n- [ ] 指定输出路径\n### 开发者说明\n- `mvn clean install`即可以重新打包项目\n- 如对搜索逻辑不满，可提issue或者直接在`ClazzDiscovery`中修改为你的逻辑，代码很通俗\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluelueking%2FClazzSearcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluelueking%2FClazzSearcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluelueking%2FClazzSearcher/lists"}