java - 如何调用另一个 .java 文件中存在的类(不是嵌套类)?

标签 java cannot-find-symbol

我写了一个 SQL 解析器,代码工作正常,我可以在解析结束时看到正确的输出。现在我尝试在 JSP 中显示解析的输出。为此,我在 IntelliJ 上设置了该项目,如下图所示。

enter image description here

我之前编写的解析器在 getTableColumn 中有其主要方法,该方法在图像中的红色框中标记。 看起来像这样。

public class getTableColumn {
    ..
    ..
    public static void main(String args[]) throws SQLException {
        ReadQueries rq = new ReadQueries("query");
        String output  = rq.getData();
        ....
        ....
        ....
        ....
    }
 }

ReadQueries 是我声明所有自定义方法来解析 SQL 的类。 getData 方法返回解析后的输出,它存在于字符串output 中。我正在尝试在 jsp 中显示 output 的值。

我将 getTableColumn 中的 main 方法重命名为 processQuery,以便我也可以从其他类调用它。 基于 JSP 中的下拉列表,我尝试将字符串值传递到 getTableColumn 的 processQuery 中,如下所示。

import com.query.data.ReadQueries;
import com.table.modules.TableModules;
import com.where.WhereData;
import gudusoft.gsqlparser.EDbVendor;
import gudusoft.gsqlparser.IMetaDatabase;
import save.querydata.InsertColumns;

import java.io.File;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

class sampleMetaDB implements IMetaDatabase {
    String columns[][] = { {"server", "db", "schema", "TBL_BBGPOS_REP", "M_TP_PFOLIO"
            }, { "server", "db", "schema", "A_FXPOSITIONDEL_REP", "M_FXDELTA"}, 
               {"server", "db", "schema", "A_FXPOSITIONDEL_REP", "M_CLOSING_E" }, 
               {"server", "db", "schema", "A_FXPOSITIONDEL_REP", "M_FXDELTA_Z"}
    };

    public boolean checkColumn(String server, String database, String schema, String table, String column) {
        boolean bServer, bDatabase, bSchema, bTable, bColumn, bRet = false;
        for (int i = 0; i < columns.length; i++) {
            if ((server == null) || (server.length() == 0)) {
                bServer = true;
            } else {
                bServer = columns[i][0].equalsIgnoreCase(server);
            }
            if (!bServer) continue;
            if ((database == null) || (database.length() == 0)) {
                bDatabase = true;
            } else {
                bDatabase = columns[i][1].equalsIgnoreCase(database);
            }
            if (!bDatabase) continue;
            if ((schema == null) || (schema.length() == 0)) {
                bSchema = true;
            } else {
                bSchema = columns[i][2].equalsIgnoreCase(schema);
            }
            if (!bSchema) continue;
            bTable = columns[i][3].equalsIgnoreCase(table);
            if (!bTable) continue;
            bColumn = columns[i][4].equalsIgnoreCase(column);
            if (!bColumn) continue;
            bRet = true;
            break;
        }
        return bRet;
    }
}

public class getTableColumn {
    private static File[] listFiles(File sqlFiles) {
        List<File> children = new ArrayList<File>();
        if (sqlFiles != null)
            listFiles(sqlFiles, children);
        return children.toArray(new File[0]);
    }

    private static void listFiles(File rootFile, List<File> children) {
        if (rootFile.isFile())
            children.add(rootFile);
        else {
            File[] files = rootFile.listFiles();
            for (int i = 0; i < files.length; i++) {
                listFiles(files[i], children);
            }
        }
    }

    public String processQuery(String category) throws SQLException {

        EDbVendor vendor = EDbVendor.dbvmysql;
        System.out.println("Processing " + vendor.toString() + "...");
        TGetTableColumn getTableColumn = new TGetTableColumn(vendor);
        getTableColumn.showDetail = false;
        getTableColumn.showSummary = true;
        getTableColumn.showTreeStructure = false;
        getTableColumn.showBySQLClause = false;
        getTableColumn.showJoin = false;
        getTableColumn.showColumnLocation = true;
        getTableColumn.linkOrphanColumnToFirstTable = false;
        getTableColumn.showIndex = false;
        getTableColumn.showDatatype = true;
        getTableColumn.listStarColumn = true;
        getTableColumn.setMetaDatabase(new sampleMetaDB());
        String sqlQuery = queryDetails[1];
        getTableColumn.run(sqlQuery, false);

        String issue = category;
        ReadQueries rq = new ReadQueries(issue);
        String outputQuery = rq.getQueries();
        long t = System.currentTimeMillis();
        EDbVendor vendor = EDbVendor.dbvmysql;

        return outputQuery();
    }

    private static void displayInitInformation() {
        System.out.println("Usage: java getTableColumn [/f <path_to_sql_file>] [/d <path_to_directory_includes_sql_files>] [/t <database type>] [/<show option>]");
        System.out.println("/f: specify the sql file path to analyze.");
        System.out.println("/t: option, set the database type. Support oracle, mysql, mssql, db2, netezza, teradata, informix, sybase, postgresql, hive, greenplum and redshift, the default type is oracle");
        System.out.println("/showSummary: default show option, display the summary information.");
        System.out.println("/showDetail: show option, display the detail information.");
        System.out.println("/showTreeStructure: show option, display the information as a tree structure.");
        System.out.println("/showBySQLClause: show option, display the information group by sql clause type.");
        System.out.println("/showJoin: show option, display the join table and column.");
    }
}

我看到的问题是我无法在 servlet 类中创建 getTableColumn 对象。

package com.servlets;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/getdata.do")
public class DataServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String issue        = request.getParameter("reportSelection");
        getTableColumn gt   = new getTableColumn();
        if ("Latency".equals(issue)) {
            getTableColumn gt   = new getTableColumn();
            System.out.println("Latency");
        } else if ("DataQuality".equals(issue)) {
            System.out.println("Data quality");
        } else if ("Outage".equals(issue)) {

        }
    }
}

行:getTableColumn gt = new getTableColumn(); 表示无法解析符号“getTableColumn”。我尝试编写该类的导入语句,但它也不起作用。 我不明白如何解决这个问题。谁能告诉我如何修复它?

最佳答案

我认为您遇到了问题,因为您的 getTableColumn 类不在包中(或者更确切地说,它在默认包中),并且 you can't import a class from the default package 。所以:

  • getTableColumn 类移至包中,例如 tablecolumn
  • 然后在 DataServlet 中添加:import tablecolumn.getTableColumn 以及其他导入

并且请将您的类的第一个字母大写:getTableColumn en tableRelationAnalyze 不是有效名称

关于java - 如何调用另一个 .java 文件中存在的类(不是嵌套类)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59319544/

相关文章:

java - 具有第三个值的 XYdataset Jfreechart 标签图

java stacktrace 显示一个阻塞的线程,但没有关于阻塞它的信息

java - 在运行时找不到依赖项maven

java - 删除 JTable 行而不将 RowIndex 转换为模型

java - “Cannot find symbol”或 “Cannot resolve symbol”错误是什么意思?

java - 在 windows 和 linux 中转换字符集

java - 编译Java代码时找不到符号

java - 如何在 JSP scriptlet 中使用 Java 类?错误说该类无法解析为类型

java - “找不到符号”或“无法解析符号”错误是什么意思?

java - Java 中出现 "cannot find symbol"错误