Java 读取类的方法并在arraylist中存储Web服务的路径名

Java 读取类的方法并在arraylist中存储Web服务的路径名,java,Java,在变量应用中,我想存储每个Web服务的路径名 等级Vtiger\u服务: String app = Vtiger_Services.class.getDeclaredMethods()[i].getName(); 我想获取getCustomer方法的路径并将字符串存储在arraylist中,是否存在错误或异常?我可以将方法的名称写入列表: ArrayList<String> list = new ArrayList<String>(); try

在变量应用中,我想存储每个Web服务的路径名

等级Vtiger\u服务:

String app = Vtiger_Services.class.getDeclaredMethods()[i].getName();

我想获取getCustomer方法的路径并将字符串存储在arraylist中,是否存在错误或异常?我可以将方法的名称写入列表:

ArrayList<String> list = new ArrayList<String>();

        try
        {

            for(int i = 0; i < Vtiger_Services.class.getMethods().length; i++)
            {
                if(Vtiger_Services.class.getMethods()[i].getParameters().length > 0 && 
                   Vtiger_Services.class.getMethods()[i].getParameters()[0].getType().getSimpleName().equals("String") &&
                   Vtiger_Services.class.getMethods()[i].getReturnType().getSimpleName().equals("String"))
                {

                        String app = Vtiger_Services.class.getDeclaredMethods()[i].getName();
                        list.add(app);
                        //se non sono uguali li aggiungo
                        con.createStatement().execute("INSERT INTO Services (Name) VALUES ('"+ Vtiger_Services.class.getDeclaredMethods()[i].getName()+"')");//popolo la tabella services
                    }
                }

            }

            System.out.println(list);
        }
public class Vtiger_Services{ `@Path("getCustomer/{code : .+}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getCustomer(@HeaderParam("token") String token, @PathParam("code") int code) // il codice cliente è un intero
{
    if (token.equalsIgnoreCase(this.token)) {
        String sql = "select .......";
        // System.out.println(sql);
        Database db = new Database();
        String json = db.executeQueryTOJSON(sql);
        // System.out.println(json);
        return json;
    } else
        return "{\"error\":\"bad token provided or customer code\"}";
} 
我刚刚编写了将方法名持久化为字符串的语句。 我得到了输出:

class Vtiger_Services {

    public void method1() {
    }

    public String method2(String val) {
        return "";
    }
}

由于不知道使用HTTP作为端点(映射到URL路径)公开服务所使用的技术/框架,我无法回答您的问题。不过,我会尝试给出一个大致的方向:

您必须自己实现URL路径映射以使用方法名称构造路径,或者需要访问web服务框架映射状态以从中提取URL路径

Java反射非常昂贵/缓慢,因此您应该只调用以下方法一次,将返回值赋给一个变量,然后使用该变量(重构->提取变量)编辑:有关部分实现,请参阅jacq_42答案:

INSERT INTO Services (Name) VALUES ('method2')
[method2]
如果您编写的代码应该定期运行,那么您可能希望用插入或更新的语句替换insert语句。稍后,您很可能还需要删除不再存在的web服务条目(有人从Vtiger_服务类中删除了一个方法)

不要使用字符串连接创建SQL语句,请使用参数化语句()。在您的示例中,您添加到查询的不是用户输入,因此不存在安全风险。由于方法名称很可能永远不会包含一个引号,所以在理论上,您也可以使用引号,因此,您可以像这样构建语句,并且是安全的。但情况并非总是如此,最终您将构建一些易受SQL注入攻击的东西。如果您感兴趣,它将列在web应用程序的前10大安全风险中:

我希望这对你的旅程有所帮助:)

编辑: 由于您需要@Path注释的值,因此应该能够使用getAnnotation获取路径:

Vtiger_Services.class.getMethods()
Vtiger_Services.class.getMethods()[i].getParameters()
注释
参考应为您提供获取路径的方法

您应该认真检查SQL注入攻击,因为

Path annotation = method.getAnnotation(Path.class)

看起来很危险。

我想知道每个方法的所有路径。。不仅仅是che name示例:searchSottoGruppo/{sigcos:.+}/{codgru:.+}/{codsgr:.+}/{dessgr:.+}/{dessgr:.+}函数getName,我只得到SearchSottogruppoca你能发布一个你的Vtiger_服务类的例子吗?谢谢,但我想得到每个方法的路径,不仅仅是名称,如果是
Vtiger_服务
类,你能提供一个方法的片段吗?我能阅读xml,然后得到每个web服务的路径吗?不,我甚至没有提到xml。我说过,您可以检索注释,这些注释前面有@符号,使用方法的反射,就像获取方法名称一样。注释路径包含路径的字符串值。因此,如果您从方法中获取路径注释,您可以向获取的实例询问其值,这将是您正在查找的路径字符串。您能给我举个例子吗?
Path annotation = method.getAnnotation(Path.class)
String sql = "select .......";
...
String json = db.executeQueryTOJSON(sql);