Skip to content
This repository has been archived by the owner on Nov 30, 2023. It is now read-only.

Commit

Permalink
#62
Browse files Browse the repository at this point in the history
  • Loading branch information
4ra1n committed Jan 21, 2023
1 parent 588fd47 commit 4e591be
Show file tree
Hide file tree
Showing 6 changed files with 151 additions and 19 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.MD
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,5 @@ Others:
## 0.9

更新内容:
- [important] 表达式搜索 #62
- [important] 支持拖入Jar文件加载 #61
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@

(在该库`https://code.google.com/archive/p/jsyntaxpane`的基础上加了很多黑科技)

新功能:目前正在开发表达式搜索功能

![](img/007.png)

## Quick Start

重要:请使用Java 11 - Java 17运行 (已提供内置`JRE``EXE`版本)
Expand Down
Binary file added img/007.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
72 changes: 67 additions & 5 deletions src/main/java/com/chaitin/jar/analyzer/form/ELForm.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package com.chaitin.jar.analyzer.form;

import com.chaitin.jar.analyzer.core.ClassReference;
import com.chaitin.jar.analyzer.core.MethodReference;
import com.chaitin.jar.analyzer.model.ResObj;
import com.chaitin.jar.analyzer.spel.MethodEL;
import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import jsyntaxpane.syntaxkits.JavaSyntaxKit;
import org.objectweb.asm.Type;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import javax.swing.*;
import java.awt.*;
import java.util.Map;

public class ELForm {
public JPanel elPanel;
Expand Down Expand Up @@ -39,14 +45,70 @@ public ELForm(JarAnalyzerForm instance) {
ExpressionParser parser = new SpelExpressionParser();
String spel = elEditor.getText();

if (spel.contains("Runtime") || spel.contains("Process")) {
JOptionPane.showMessageDialog(this.elEditor, "你在干什么?");
Object value;
try {
MethodEL m = new MethodEL();
Expression exp = parser.parseExpression(spel);
StandardEvaluationContext ctx = new StandardEvaluationContext();
ctx.setVariable("method", m);
value = exp.getValue(ctx);
} catch (Exception ex) {
JOptionPane.showMessageDialog(this.elEditor, "语法错误");
return;
}

Expression exp = parser.parseExpression(spel);
StandardEvaluationContext ctx = new StandardEvaluationContext();
exp.getValue(ctx);
if (value instanceof MethodEL) {
MethodEL condition = (MethodEL) value;

DefaultListModel<ResObj> searchList = new DefaultListModel<>();

for (Map.Entry<MethodReference.Handle, MethodReference> entry :
JarAnalyzerForm.methodMap.entrySet()) {
ClassReference.Handle ch = entry.getValue().getClassReference();
MethodReference mr = entry.getValue();
String classCon = condition.getClassNameContains();
String mnCon = condition.getNameContains();
String retCon = condition.getReturnType();
Map<Integer, String> paramMap = condition.getParamTypes();
int i = condition.getParamsNum();
boolean f = condition.isStatic();

int paramNum = Type.getMethodType(mr.getDesc()).getArgumentTypes().length;
String ret = Type.getReturnType(mr.getDesc()).getClassName();

boolean aa = ch.getName().contains(classCon);
boolean ab = mr.getName().contains(mnCon);
boolean ac = (i == paramNum);
boolean ad = ret.equals(retCon);
boolean ae = (mr.isStatic() == f);
boolean af = true;
Type[] argTypes = Type.getArgumentTypes(mr.getDesc());
for (int ix = 0; ix < argTypes.length; ix++) {
String temp = paramMap.get(ix);
if (temp == null) {
continue;
}
if (!paramMap.get(ix).equals(argTypes[ix].getClassName())) {
af = false;
break;
}
}

if (aa && ab && ac && ad && ae && af) {
searchList.addElement(new ResObj(mr.getHandle(), ch.getName()));
}
}

if (searchList.size() == 0) {
JOptionPane.showMessageDialog(this.elEditor, "没有找到结果");
} else {
JOptionPane.showMessageDialog(this.elEditor, "搜索成功");
}

instance.resultList.setModel(searchList);
} else {
JOptionPane.showMessageDialog(this.elEditor, "错误的表达式");
}
});
}

Expand Down
83 changes: 73 additions & 10 deletions src/main/java/com/chaitin/jar/analyzer/spel/MethodEL.java
Original file line number Diff line number Diff line change
@@ -1,41 +1,104 @@
package com.chaitin.jar.analyzer.spel;

import java.util.HashMap;
import java.util.Map;

public class MethodEL {
private String classNameContains;
private String nameContains;
private String returnContains;
private String classNameContains;
private Map<Integer, String> paramTypes;
private String nameContains;
private String returnType;
private int paramsNum;
boolean isStatic;

// -------------------- GETTER/SETTER -------------------- //
public String getClassNameContains() {
return classNameContains;
}

public void setClassNameContains(String classNameContains) {
this.classNameContains = classNameContains;
}

public Map<Integer, String> getParamTypes() {
return paramTypes;
}

public void setParamTypes(Map<Integer, String> paramTypes) {
this.paramTypes = paramTypes;
}

public String getNameContains() {
return nameContains;
}

public String getReturnContains() {
return returnContains;
public void setNameContains(String nameContains) {
this.nameContains = nameContains;
}

public String getReturnType() {
return returnType;
}

public void setReturnType(String returnType) {
this.returnType = returnType;
}

public int getParamsNum() {
return paramsNum;
}

public MethodEL nameContains(String str){
public void setParamsNum(int paramsNum) {
this.paramsNum = paramsNum;
}

public boolean isStatic() {
return isStatic;
}

public void setStatic(boolean aStatic) {
isStatic = aStatic;
}

public MethodEL (){
this.paramTypes = new HashMap<>();
}

// -------------------- EL -------------------- //

@SuppressWarnings("unused")
public MethodEL nameContains(String str) {
this.nameContains = str;
return this;
}
public MethodEL classNameContains(String str){

@SuppressWarnings("unused")
public MethodEL classNameContains(String str) {
this.classNameContains = str;
return this;
}
public MethodEL returnContains(String str){
this.returnContains = str;

@SuppressWarnings("unused")
public MethodEL returnType(String str) {
this.returnType = str;
return this;
}

@SuppressWarnings("unused")
public MethodEL paramTypeMap(int index, String type) {
this.paramTypes.put(index, type);
return this;
}
public MethodEL paramsNum(int i){

@SuppressWarnings("unused")
public MethodEL paramsNum(int i) {
this.paramsNum = i;
return this;
}

@SuppressWarnings("unused")
public MethodEL isStatic(boolean flag) {
this.isStatic = flag;
return this;
}
}
10 changes: 6 additions & 4 deletions src/main/java/com/chaitin/jar/analyzer/spel/Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ public static void main(String[] args) {
MethodEL m = new MethodEL();
ExpressionParser parser = new SpelExpressionParser();

String spel1 = "#method.nameContains('test')" +
".classNameContains('test')"+
".returnContains('int')"+
".paramsNum(3)";
String spel1 = "#method.nameContains(\"rce\")\n" +
".classNameContains(\"RCE\")\n" +
".returnType(\"java.lang.String\")\n" +
".paramTypeMap(0,\"java.lang.String\")\n" +
".paramsNum(1)\n" +
".isStatic(false)";

Expression exp = parser.parseExpression(spel1);
StandardEvaluationContext ctx = new StandardEvaluationContext();
Expand Down

0 comments on commit 4e591be

Please sign in to comment.