- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用INRIA开发的工具spoon来解析一个项目的方法调用,我已经有一个方法mysql表,其中存储了所有方法(methodid、methodname、classid、classname)。我使用以下代码来提取项目中的方法调用:
SpoonAPI spoon = new Launcher();
spoon.addInputResource("C:\\Users\\mouna\\Downloads\\chess and gantt code\\workspace_codeBase\\Chess\\src");
spoon.getEnvironment().setAutoImports(true);
spoon.getEnvironment().setNoClasspath(true);
CtModel model = spoon.buildModel();
//List<String> classnames= new ArrayList<String>();
// Interact with model
Factory factory = spoon.getFactory();
ClassFactory classFactory = factory.Class();
MethodFactory methodFactory = factory.Method();
List<methodcalls> methodcallsList = new ArrayList<methodcalls>();
for(CtType<?> clazz : classFactory.getAll()) {
for(CtMethod<?> method :clazz.getMethods()) {
String methname=method.getSimpleName();
System.out.println("CALLER METHOD=====>"+methname);
List<CtInvocation> methodcalls = method.getElements(new TypeFilter<>(CtInvocation.class));
for( CtInvocation calledmethod: methodcalls) {
//CALLEE EXECUTABLE
String CALLEENAME= calledmethod.getExecutable().getSignature().toString();
String methodCallee=calledmethod.getExecutable().toString();
if(calledmethod.getTarget()!=null) {
//CALLEE TARGET
String CALLEENAMETARGET= calledmethod.getTarget().toString();
System.out.println("TARGET: "+ CALLEENAMETARGET);
}
//CALLEE METHOD INFORMATION
ResultSet callingmethodsrefined2 = st.executeQuery("SELECT methods.* from methods where methods.methodname='"+CALLEENAME+"' ");
while(callingmethodsrefined2.next()) {
String CALLEECLASSNAME = callingmethodsrefined2.getString("classname");
String CALLEECLASSID = callingmethodsrefined2.getString("classid");
String CALLEEID = callingmethodsrefined2.getString("id");
System.out.println("CALLEE CLASS NAME: "+ CALLEECLASSNAME);
}
//CALLER METHOD INFORMATION
String CALLERCLASSNAME=clazz.getQualifiedName() ;
String CallerMethod= method.getSignature();
ResultSet callingmethodsrefined = st.executeQuery("SELECT methods.* from methods where methods.methodname='"+CallerMethod+"'and methods.classname='"+CALLERCLASSNAME+"'");
if(callingmethodsrefined.next()) {
String CallerMethodID = callingmethodsrefined.getString("id");
String CALLERCLASSNAME = callingmethodsrefined.getString("classname");
String CALLERCLASSID = callingmethodsrefined.getString("classid");
System.out.println("CALLEE METHOD ID: "+ CALLEEID);
}
String fullcaller= CALLERCLASSNAME+"."+CallerMethod;
String fullcallee= CALLEECLASSNAME+"."+CALLEENAME;
methodcalls methodcall= new methodcalls(CALLEEID, fullcaller, CALLEECLASSNAME, CallerMethodID, fullcallee, CALLERCLASSNAME);
if( methodcall.contains(methodcallsList, methodcall)==false && CallerMethodID!=null && CALLEEID!=null) {
String statement = "INSERT INTO `methodcalls`(`callermethodid`, `callername`, `callerclass`, `callerclassid`,`fullcaller`,`calleemethodid`, `calleename`, `calleeclass`, `calleeclassid`, `fullcallee`) VALUES ('"+CallerMethodID +"','" +CallerMethod+"','" +CALLERCLASSNAME+"','" +CALLERCLASSID+"','" +fullcaller+"','" +CALLEEID+"','" +CALLEENAME+"','" +CALLEECLASSNAME+"','" +CALLEECLASSID+"','" +fullcallee+"')";
st.executeUpdate(statement);
methodcallsList.add(methodcall);
}
}
}
}
问题是我无法检索被调用者所属的类,我只能检索方法签名,这是一个问题,因为可以在多个类中找到相同的方法(例如 isWhite()),因此当我仅根据方法名称查询数据库“方法”表时,我最终会得到多个结果。我尝试使用它来检索被调用者所属的类 String methodCallee=usedmethod.getExecutable().getClass().getSimpleName();但返回:“CtExecutableReferenceImpl”。
我遇到的另一个问题是我依赖 calledmethod.getExecutable() 来提取方法被调用者。但是, Calledmethod.getTarget() 本身可以包含一些被调用者,我打印了 Calledmethod.getTarget() 的内容,并为其中一个调用者获得了 TARGET: getLastPly().getDestination() 。如果目标由一系列被调用者组成,是否有办法将它们全部分开?另外,我需要知道每个“目标被调用者”所属的类列表,我对 Spoon 还很陌生,所以我真的不知道要使用哪些 API
最佳答案
I have tried using this to retrieve the class to which the callee belongs to String methodCallee=calledmethod.getExecutable().getClass().getSimpleName(); but that returned: "CtExecutableReferenceImpl".
我认为您正在寻找的方法实际上是getDeclaringType()
。此方法在 CtExecutable
接口(interface)中不可用,因此您必须检查您的可执行文件确实是 CtMethod
的实例,并且在转换它之后您可以使用 getDeclaringType
。请参阅:http://spoon.gforge.inria.fr/mvnsites/spoon-core/apidocs/spoon/reflect/declaration/CtTypeMember.html#getDeclaringType--
我不确定您的第二个问题:您能否提供一个示例,这会有所帮助。
关于java - INRIA SPOON API MethodCalls - 检索 method.getExecutable() 和 method.getTarget() 的被调用者类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51460797/
本文整理了Java中org.odata4j.expression.YearMethodCallExpression.getTarget()方法的一些代码示例,展示了YearMethodCallExpr
本文整理了Java中mage.game.events.ZoneChangeEvent.getTarget()方法的一些代码示例,展示了ZoneChangeEvent.getTarget()的具体用法。
我试图建议大型第三方应用程序使用以下切入点/建议来拦截所有字段访问: before(Object target): get(* *) && target(target) && !within(aspe
我正在努力使蓝牙聊天示例与远程服务而不是本地服务一起使用(以供以后使用)。 但是当我尝试使用用于显示发送和接收的消息的处理程序时,会发生错误,我不知道如何修复: mHandler.obtainMess
本文整理了Java中org.jruby.ir.targets.YieldSite.getTarget()方法的一些代码示例,展示了YieldSite.getTarget()的具体用法。这些代码示例主要
我有以下代码可以使用,但我只是不明白它是如何工作的,首先请引用以下链接 http://developer.android.com/reference/android/os/Message.html#s
本文整理了Java中com.android.dx.io.instructions.ZeroRegisterDecodedInstruction.getTarget()方法的一些代码示例,展示了Zero
本文整理了Java中pl.edu.icm.model.bwmeta.y.YRelation.getTarget()方法的一些代码示例,展示了YRelation.getTarget()的具体用法。这些代
方法 getSource()和 getTarget() org.jgrapht.graph.DefaultEdge 上的 DefaultEdge 受到保护。 我应该如何访问 edgeSet() 返回的
我的 WP7 应用程序有问题。我正在尝试编写 WP7 应用程序表单 WPF 示例代码。 private void storyboard_Completed(object sender, Eve
我正在尝试使用INRIA开发的工具spoon来解析一个项目的方法调用,我已经有一个方法mysql表,其中存储了所有方法(methodid、methodname、classid、classname)。我
我是一名优秀的程序员,十分优秀!