хотел получить возвращаемый тип и типы параметров из всех методов, представленных в классе

77
8

В моем коде я получаю имена методов, присутствующих в классе. я хотел получить типы возвращаемых данных и типы параметров всех методов, присутствующих во всем классе. Я попробовал это, используя подстроку, а также reflection.but, не получая надлежащего вывода.

Для типа 1 он дает результат только для одного метода правильно, для того, чтобы оставить его доступным только для публики.

Для типа 2, выход выглядит следующим образом:

The Method Found is: public int java.lang.String.hashCode()

METHOD FOUND:public int java.lang.String.hashCode()

Return Type: int

PArams: int

PArams: int

Какой не ожидаемый результат.

Мой класс содержит метод follwing:

public int test(int a, intb)

public static String Add(String str)

public static void main(String args[])

Ожидаемый результат должен быть:

Method Found: public int test(int a, intb)

Return Type: int

Parameter Type: inta intb

такой же для отдыха 2 тоже.

Любая помощь заметна. Спасибо заранее.

В коде я закомментировал как //type-1 и//type-2

Вот мой код:

    package com.sify.ABCD;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/** Class to Recursively searching the folders, and files and
* the comments inside the files
* @param <Data>
*
*/

public class ABCDTool {

String projectCode="027505";

public static void main(String[] args) throws NoSuchMethodException {
String parentFolder="D:/TestFileProgram";

ABCDTool abcdTool = new ABCDTool();
abcdTool.execute(parentFolder);

}

public void execute(String fileName) throws NoSuchMethodException {

File file = new File(fileName);
if(file.isFile()){
if(file.getName().contains(".java")){
readFile(file);
}
}
else if (file.isDirectory()){
System.out.println("Analysing Directory: "+file);
String[] list = file.list();
for (String innerFile : list) {
execute(file+"/"+innerFile);
}

}

}

public void readFile(File file) throws NoSuchMethodException {

String className=null;
String packageName=null;
String methodName=null;
String methodReturn=null;
String[] methodParams=null;
boolean packageFound=false;
boolean classFound=false;
boolean methodLineFound=false;
Method method = null;
Class classObject = null;

try {

System.out.println("Reading file: "+file);

List<FixDetails> fileNameList = new ArrayList<FixDetails>();
BufferedReader bufferReader = new BufferedReader(new FileReader(file.getPath()));

String line="";

while ((line = bufferReader.readLine()) != null) {

int packageLength = "package ".length();
int classLength ="class ".length();
int indexOfPackage = line.indexOf("package ");
int indexOfClass = line.indexOf("class ");
int indexOfMethod = line.indexOf("public ");
int indexOfSemicolon= line.indexOf(";");
int indexOfOpenBrace = line.indexOf("(");
int indexOfCloseBrace = line.indexOf(")");
int indexOfMethodName = line.indexOf("methodName ");

//Finds Package Name

if((!packageFound) && indexOfPackage > -1) {

packageName = line.substring(indexOfPackage + packageLength, indexOfSemicolon);
System.out.println("Package Name: " + packageName + " ");
packageFound=true;
}

//Finds Class Name

if((!classFound) && indexOfClass > -1){

String modified = line.substring(indexOfClass + classLength);
String st[] = modified.split(" ");
className = st[0].trim();
System.out.println("Class Name: " + className + " ");

/*Method m[] = className.getClass().getDeclaredMethods();
System.out.println("The Method Found is: " + m[1]);
for (Method method2 : m)
{

System.out.println("METHOD FOUND:"+method);
System.out.println(method2.getReturnType());
Class pr[] = method2.getParameterTypes();
for (Class class1 : pr)
{
System.out.println(class1);
}

}*/
/*String pathName = packageName+"."+ className;
System.out.println("The path name is "+ pathName);
classObject = Class.forName(pathName);
Method m[] = classObject.getDeclaredMethods();
System.out.println("The methods present are" + m);
System.out.println("ClassObject:"+ classObject);*/

classFound = true;
}

//Finds Method Name
**if(indexOfMethod >-1 && indexOfOpenBrace >-1){

String modified = line.substring(indexOfMethod, indexOfOpenBrace);
String st[] = modified.split(" ");
methodName = st[st.length-1];
System.out.println("methodName="+methodName);
System.out.println("method line="+line);**
//Get method returnType and Params
if ((line !=null)) {
//Type-1
String str=line;
System.out.println("tested:"+str);
String[] temp = str.split(" ");

for (String st1 : temp){
if(st1.equalsIgnoreCase("private")||st1.equalsIgnoreCase("protected")||
st1.equalsIgnoreCase("static")||st1.equalsIgnoreCase("public")||st1.equalsIgnoreCase("synchronized"))
{

}
else {
System.out.println("Return Type should be:"+st1);
break;
}

}
/*for (int i =0; i < temp.length ; i++)
System.out.println("Splitted Return Type string:" +temp[i]);*/
//Type-2
Method m[] = className.getClass().getDeclaredMethods();
System.out.println("The Method Found is: " + m[0]);
for (Method method2 : m)
{

System.out.println("METHOD FOUND:"+method);
System.out.println("Return Type: "+method2.getReturnType());
Class pr[] = method2.getParameterTypes();
for (Class class1 : pr)
{
System.out.println("PArams: "+class1);
}

}
String paramList=line.substring(indexOfOpenBrace+1, indexOfCloseBrace);
System.out.println("Present Params are:" + paramList);
methodParams=paramList.split(",");
for (int i =0; i < methodParams.length ; i++)
System.out.println("Splitted Paramstring:" +methodParams[i]);
/*
String returnTypeStore[] = str.split(" ");
methodReturn = returnTypeStore[returnTypeStore.length-1];
System.out.println("Method Return Type:" + methodReturn);*/

}
else System.out.println("Methodname not found");
methodLineFound=true;
}

if(line.contains(this.projectCode)){
System.out.println("Found:"+line);
//System.out.println("methodName="+methodName);
if(classFound){
// create FixDetails object.
FixDetails fixDetails = new FixDetails(packageName, className, methodName);

// set all required params.

/*fixDetails.setPackageName(packageName);
fixDetails.setClassName(className);
fixDetails.setMethodName(methodName);*/

System.out.println("fixDetails:" + fixDetails);
}else{System.out.println("Class not found yet.");}
}

}

bufferReader.close();

}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} /*catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/

}

public Method getMethod(Class classObject, String line, String methodName) throws SecurityException, NoSuchMethodException {
// TODO Auto-generated method stub

System.out.println("Trying to search "+methodName +" in class "+classObject);
System.out.println("line="+line);
/*Class[] cArg = new Class[1];
cArg[0] = int.class;
Method m1= classObject.getClass().getDeclaredMethod(methodName, cArg );
return m1;*/ return null;
}

}

спросил(а) 2021-01-28T00:53:44+03:00 4 месяца, 3 недели назад
1
Решение
78

Вы можете использовать.class.getMethods(), чтобы получить все методы класса (также возвращает методы из расширенных классов)

Method[] methods = ABCTool.class.getMethods();

Обратите внимание на.getName() (имя метода).getReturnType() и.getParameterTypes(), вы можете вызвать метод

пример

public class ABCDTool {

public String method1(String param) {
return "Working";
}

public static void main(String[] args) {
Method[] methods = ABCDTool.class.getMethods();
for(Method method : methods){
System.out.println("Method Found: " + method.getName());
System.out.println("Return type: " + method.getReturnType().getName());

Object[] params = method.getParameterTypes();
for(Object param : params) {
System.out.println("Parameter Type: " + param);
}
System.out.println();
}
}

}

Обратите внимание: если вы не хотите, чтобы методы "wait", "notify" и "notifyall" из Object, вам нужно добавить некоторую логику, чтобы исключить их (.getName(). Equals ("wait"))

ответил(а) 2021-01-28T00:53:44+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема