java-class-analyzer-mcp-server 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,314 @@
1
+ import * as path from 'path';
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ import { DependencyScanner } from '../scanner/DependencyScanner.js';
5
+ const execAsync = promisify(exec);
6
+ export class JavaClassAnalyzer {
7
+ scanner;
8
+ constructor() {
9
+ this.scanner = new DependencyScanner();
10
+ }
11
+ /**
12
+ * 分析Java类的结构信息
13
+ */
14
+ async analyzeClass(className, projectPath) {
15
+ try {
16
+ // 1. 获取类文件路径
17
+ const jarPath = await this.scanner.findJarForClass(className, projectPath);
18
+ if (!jarPath) {
19
+ throw new Error(`未找到类 ${className} 对应的JAR包`);
20
+ }
21
+ // 2. 直接使用 javap 分析JAR包中的类
22
+ const analysis = await this.analyzeClassWithJavap(jarPath, className);
23
+ return analysis;
24
+ }
25
+ catch (error) {
26
+ console.error(`分析类 ${className} 失败:`, error);
27
+ throw error;
28
+ }
29
+ }
30
+ /**
31
+ * 使用 javap 工具分析JAR包中的类结构
32
+ */
33
+ async analyzeClassWithJavap(jarPath, className) {
34
+ try {
35
+ const javapCmd = this.getJavapCommand();
36
+ const quotedJavapCmd = javapCmd.includes(' ') ? `"${javapCmd}"` : javapCmd;
37
+ const quotedJarPath = jarPath.includes(' ') ? `"${jarPath}"` : jarPath;
38
+ // 使用 javap -v 获取详细信息(包括参数名称)
39
+ const { stdout } = await execAsync(`${quotedJavapCmd} -v -cp ${quotedJarPath} ${className}`, { timeout: 10000 });
40
+ return this.parseJavapOutput(stdout, className);
41
+ }
42
+ catch (error) {
43
+ console.error('javap 分析失败:', error);
44
+ throw new Error(`javap 分析失败: ${error instanceof Error ? error.message : String(error)}`);
45
+ }
46
+ }
47
+ /**
48
+ * 解析 javap 输出
49
+ */
50
+ parseJavapOutput(output, className) {
51
+ const lines = output.split('\n');
52
+ const analysis = {
53
+ className: className.split('.').pop() || className,
54
+ packageName: '',
55
+ modifiers: [],
56
+ superClass: undefined,
57
+ interfaces: [],
58
+ fields: [],
59
+ methods: []
60
+ };
61
+ let currentMethod = null;
62
+ let inLocalVariableTable = false;
63
+ let methodParameters = {};
64
+ for (let i = 0; i < lines.length; i++) {
65
+ const line = lines[i];
66
+ const trimmedLine = line.trim();
67
+ // 解析类声明
68
+ if (trimmedLine.startsWith('public class') || trimmedLine.startsWith('public interface') ||
69
+ trimmedLine.startsWith('public enum')) {
70
+ this.parseClassDeclaration(trimmedLine, analysis);
71
+ continue;
72
+ }
73
+ // 解析方法声明
74
+ if (trimmedLine.startsWith('public ') && trimmedLine.includes('(') && trimmedLine.includes(')')) {
75
+ currentMethod = this.parseMethodFromJavap(trimmedLine);
76
+ if (currentMethod) {
77
+ analysis.methods.push(currentMethod);
78
+ methodParameters = {};
79
+ }
80
+ continue;
81
+ }
82
+ // 检测 LocalVariableTable 开始
83
+ if (trimmedLine === 'LocalVariableTable:') {
84
+ inLocalVariableTable = true;
85
+ continue;
86
+ }
87
+ // 解析 LocalVariableTable 中的参数名称
88
+ if (inLocalVariableTable && currentMethod) {
89
+ if (trimmedLine.startsWith('Start') || trimmedLine.startsWith('Slot')) {
90
+ continue; // 跳过表头
91
+ }
92
+ if (trimmedLine === '') {
93
+ // LocalVariableTable 结束,立即更新当前方法的参数名称
94
+ if (Object.keys(methodParameters).length > 0) {
95
+ const updatedParams = [];
96
+ for (let j = 0; j < currentMethod.parameters.length; j++) {
97
+ const paramType = currentMethod.parameters[j];
98
+ const paramName = methodParameters[j] || `param${j + 1}`;
99
+ updatedParams.push(`${paramType} ${paramName}`);
100
+ }
101
+ currentMethod.parameters = updatedParams;
102
+ }
103
+ inLocalVariableTable = false;
104
+ methodParameters = {};
105
+ continue;
106
+ }
107
+ // 解析参数行: "0 6 0 file Ljava/io/File;"
108
+ const paramMatch = trimmedLine.match(/^\s*\d+\s+\d+\s+(\d+)\s+(\w+)\s+(.+)$/);
109
+ if (paramMatch) {
110
+ const slot = parseInt(paramMatch[1]);
111
+ const paramName = paramMatch[2];
112
+ const paramType = paramMatch[3];
113
+ // 只处理参数(slot >= 0,但排除局部变量)
114
+ // 参数通常在前几个 slot 中,局部变量在后面
115
+ if (slot >= 0 && slot < currentMethod.parameters.length) {
116
+ methodParameters[slot] = paramName;
117
+ }
118
+ }
119
+ }
120
+ // 检测方法结束 - 当遇到下一个方法或类结束时
121
+ if (currentMethod && ((trimmedLine.startsWith('public ') && trimmedLine.includes('(') && trimmedLine.includes(')')) ||
122
+ trimmedLine.startsWith('}') ||
123
+ trimmedLine.startsWith('SourceFile:'))) {
124
+ // 更新方法的参数名称
125
+ if (Object.keys(methodParameters).length > 0) {
126
+ const updatedParams = [];
127
+ for (let j = 0; j < currentMethod.parameters.length; j++) {
128
+ const paramType = currentMethod.parameters[j];
129
+ const paramName = methodParameters[j] || `param${j + 1}`;
130
+ updatedParams.push(`${paramType} ${paramName}`);
131
+ }
132
+ currentMethod.parameters = updatedParams;
133
+ }
134
+ currentMethod = null;
135
+ inLocalVariableTable = false;
136
+ methodParameters = {};
137
+ }
138
+ }
139
+ return analysis;
140
+ }
141
+ /**
142
+ * 解析类声明
143
+ */
144
+ parseClassDeclaration(line, analysis) {
145
+ // 提取修饰符
146
+ const modifiers = line.match(/\b(public|private|protected|static|final|abstract|strictfp)\b/g) || [];
147
+ analysis.modifiers = modifiers;
148
+ // 提取包名(从类名推断)
149
+ const classMatch = line.match(/(?:public\s+)?(?:class|interface|enum)\s+([a-zA-Z_$][a-zA-Z0-9_$.]*)/);
150
+ if (classMatch) {
151
+ const fullClassName = classMatch[1];
152
+ const parts = fullClassName.split('.');
153
+ if (parts.length > 1) {
154
+ analysis.packageName = parts.slice(0, -1).join('.');
155
+ analysis.className = parts[parts.length - 1];
156
+ }
157
+ }
158
+ // 提取父类
159
+ const extendsMatch = line.match(/extends\s+([a-zA-Z_$][a-zA-Z0-9_$.]*)/);
160
+ if (extendsMatch) {
161
+ analysis.superClass = extendsMatch[1];
162
+ }
163
+ // 提取接口
164
+ const implementsMatch = line.match(/implements\s+([^{]+)/);
165
+ if (implementsMatch) {
166
+ const interfaces = implementsMatch[1]
167
+ .split(',')
168
+ .map(iface => iface.trim())
169
+ .filter(iface => iface);
170
+ analysis.interfaces = interfaces;
171
+ }
172
+ }
173
+ /**
174
+ * 从 javap 输出解析方法
175
+ */
176
+ parseMethodFromJavap(line) {
177
+ try {
178
+ const trimmedLine = line.trim();
179
+ // 提取修饰符
180
+ const modifiers = [];
181
+ let startIndex = 0;
182
+ const modifierWords = ['public', 'private', 'protected', 'static', 'final', 'abstract', 'synchronized', 'native'];
183
+ // 处理多个修饰符
184
+ let remainingLine = trimmedLine;
185
+ while (true) {
186
+ let foundModifier = false;
187
+ for (const modifier of modifierWords) {
188
+ if (remainingLine.startsWith(modifier + ' ')) {
189
+ modifiers.push(modifier);
190
+ remainingLine = remainingLine.substring(modifier.length + 1);
191
+ startIndex += modifier.length + 1;
192
+ foundModifier = true;
193
+ break;
194
+ }
195
+ }
196
+ if (!foundModifier) {
197
+ break;
198
+ }
199
+ }
200
+ // 查找方法名和参数部分
201
+ const parenIndex = trimmedLine.indexOf('(');
202
+ if (parenIndex === -1)
203
+ return null;
204
+ const closeParenIndex = trimmedLine.indexOf(')', parenIndex);
205
+ if (closeParenIndex === -1)
206
+ return null;
207
+ // 提取返回类型和方法名
208
+ const beforeParen = trimmedLine.substring(startIndex, parenIndex).trim();
209
+ const lastSpaceIndex = beforeParen.lastIndexOf(' ');
210
+ if (lastSpaceIndex === -1)
211
+ return null;
212
+ const returnType = beforeParen.substring(0, lastSpaceIndex).trim();
213
+ const methodName = beforeParen.substring(lastSpaceIndex + 1).trim();
214
+ // 提取参数
215
+ const paramsStr = trimmedLine.substring(parenIndex + 1, closeParenIndex).trim();
216
+ const parameters = [];
217
+ if (paramsStr) {
218
+ // 处理参数,需要考虑泛型和嵌套类型
219
+ const paramParts = this.splitParameters(paramsStr);
220
+ for (const param of paramParts) {
221
+ const trimmedParam = param.trim();
222
+ if (trimmedParam) {
223
+ parameters.push(trimmedParam);
224
+ }
225
+ }
226
+ }
227
+ return {
228
+ name: methodName,
229
+ returnType,
230
+ parameters,
231
+ modifiers
232
+ };
233
+ }
234
+ catch (error) {
235
+ console.error('解析方法失败:', line, error);
236
+ return null;
237
+ }
238
+ }
239
+ /**
240
+ * 智能分割参数,处理泛型和嵌套类型
241
+ */
242
+ splitParameters(paramsStr) {
243
+ const params = [];
244
+ let current = '';
245
+ let angleBracketCount = 0;
246
+ for (let i = 0; i < paramsStr.length; i++) {
247
+ const char = paramsStr[i];
248
+ if (char === '<') {
249
+ angleBracketCount++;
250
+ }
251
+ else if (char === '>') {
252
+ angleBracketCount--;
253
+ }
254
+ else if (char === ',' && angleBracketCount === 0) {
255
+ params.push(current.trim());
256
+ current = '';
257
+ continue;
258
+ }
259
+ current += char;
260
+ }
261
+ if (current.trim()) {
262
+ params.push(current.trim());
263
+ }
264
+ return params;
265
+ }
266
+ /**
267
+ * 获取javap命令路径
268
+ */
269
+ getJavapCommand() {
270
+ const javaHome = process.env.JAVA_HOME;
271
+ if (javaHome) {
272
+ return path.join(javaHome, 'bin', 'javap.exe');
273
+ }
274
+ return 'javap';
275
+ }
276
+ /**
277
+ * 获取类的继承层次结构
278
+ */
279
+ async getInheritanceHierarchy(className, projectPath) {
280
+ const analysis = await this.analyzeClass(className, projectPath);
281
+ const hierarchy = [className];
282
+ if (analysis.superClass) {
283
+ try {
284
+ const superHierarchy = await this.getInheritanceHierarchy(analysis.superClass, projectPath);
285
+ hierarchy.unshift(...superHierarchy);
286
+ }
287
+ catch (error) {
288
+ // 如果父类不在当前项目中,直接添加
289
+ hierarchy.unshift(analysis.superClass);
290
+ }
291
+ }
292
+ return hierarchy;
293
+ }
294
+ /**
295
+ * 查找类的所有子类
296
+ */
297
+ async findSubClasses(className, projectPath) {
298
+ const allClasses = await this.scanner.getAllClassNames(projectPath);
299
+ const subClasses = [];
300
+ for (const cls of allClasses) {
301
+ try {
302
+ const analysis = await this.analyzeClass(cls, projectPath);
303
+ if (analysis.superClass === className) {
304
+ subClasses.push(cls);
305
+ }
306
+ }
307
+ catch (error) {
308
+ // 忽略分析失败的类型
309
+ }
310
+ }
311
+ return subClasses;
312
+ }
313
+ }
314
+ //# sourceMappingURL=JavaClassAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JavaClassAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/JavaClassAnalyzer.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { JavaClassAnalyzerMCPServer } from './index.js';
4
+ const program = new Command();
5
+ program
6
+ .name('java-class-analyzer-mcp')
7
+ .description('Java Class Analyzer MCP Server - 用于Java类文件分析和反编译的MCP服务器')
8
+ .version('1.0.0');
9
+ program
10
+ .command('start')
11
+ .description('启动MCP服务器')
12
+ .option('-e, --env <environment>', '运行环境 (development|production)', 'production')
13
+ .action(async (options) => {
14
+ // 设置环境变量
15
+ if (options.env) {
16
+ process.env.NODE_ENV = options.env;
17
+ }
18
+ console.log(`启动Java Class Analyzer MCP Server (${options.env}模式)...`);
19
+ const server = new JavaClassAnalyzerMCPServer();
20
+ await server.run();
21
+ });
22
+ program
23
+ .command('test')
24
+ .description('测试MCP服务器功能')
25
+ .option('-p, --project <path>', 'Maven项目路径')
26
+ .option('-c, --class <className>', '要测试的类名')
27
+ .option('--no-cache', '不使用缓存')
28
+ .option('--cfr-path <path>', 'CFR反编译工具路径')
29
+ .action(async (options) => {
30
+ console.log('测试模式 - 请使用 test-tools.js 进行完整测试');
31
+ console.log('运行: node test-tools.js --help 查看详细用法');
32
+ });
33
+ program
34
+ .command('config')
35
+ .description('生成MCP客户端配置示例')
36
+ .option('-o, --output <file>', '输出配置文件路径', 'mcp-client-config.json')
37
+ .action(async (options) => {
38
+ const config = {
39
+ mcpServers: {
40
+ "java-class-analyzer": {
41
+ command: "java-class-analyzer-mcp",
42
+ args: ["start"],
43
+ env: {
44
+ NODE_ENV: "production",
45
+ MAVEN_REPO: process.env.MAVEN_REPO || "",
46
+ JAVA_HOME: process.env.JAVA_HOME || "",
47
+ CFR_PATH: process.env.CFR_PATH || ""
48
+ }
49
+ }
50
+ }
51
+ };
52
+ const fs = await import('fs-extra');
53
+ await fs.default.writeJson(options.output, config, { spaces: 2 });
54
+ console.log(`MCP客户端配置已生成: ${options.output}`);
55
+ console.log('\n使用说明:');
56
+ console.log('1. 将此配置添加到你的MCP客户端配置文件中');
57
+ console.log('2. 根据需要修改环境变量设置');
58
+ console.log('3. 重启MCP客户端');
59
+ });
60
+ // 默认命令
61
+ if (process.argv.length === 2) {
62
+ // 如果没有提供子命令,默认启动服务器
63
+ process.env.NODE_ENV = process.env.NODE_ENV || 'production';
64
+ const server = new JavaClassAnalyzerMCPServer();
65
+ server.run().catch((error) => {
66
+ console.error('服务器启动失败:', error);
67
+ process.exit(1);
68
+ });
69
+ }
70
+ else {
71
+ program.parse();
72
+ }
73
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare class DecompilerService {
2
+ private scanner;
3
+ private cfrPath;
4
+ constructor();
5
+ private initializeCfrPath;
6
+ /**
7
+ * 反编译指定的Java类文件
8
+ */
9
+ decompileClass(className: string, projectPath: string, useCache?: boolean, cfrPath?: string): Promise<string>;
10
+ /**
11
+ * 获取缓存文件路径
12
+ */
13
+ private getCachePath;
14
+ /**
15
+ * 从JAR包中提取指定的.class文件
16
+ */
17
+ private extractClassFile;
18
+ /**
19
+ * 使用CFR反编译.class文件
20
+ */
21
+ private decompileWithCfr;
22
+ /**
23
+ * 查找CFR jar包路径
24
+ */
25
+ private findCfrJar;
26
+ /**
27
+ * 批量反编译多个类
28
+ */
29
+ decompileClasses(classNames: string[], projectPath: string, useCache?: boolean, cfrPath?: string): Promise<Map<string, string>>;
30
+ /**
31
+ * 获取Java命令路径
32
+ */
33
+ private getJavaCommand;
34
+ }
35
+ //# sourceMappingURL=DecompilerService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecompilerService.d.ts","sourceRoot":"","sources":["../../src/decompiler/DecompilerService.ts"],"names":[],"mappings":"AAeA,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAS;;YAOV,iBAAiB;IAU/B;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+DzH;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;YACW,gBAAgB;IA6D9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,UAAU;IAgCxB;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAiB3I;;OAEG;IACH,OAAO,CAAC,cAAc;CAQzB"}