-1

我想知道如何返回在 for 循环中分配的数组变量的所有值。

在下面的方法中,我将值分配给输出数组。现在我想将输出数组中的所有值显示为返回参数。由于范围级别,我得到了最后一个值。

现在,由于范围问题,我能够返回最后一个值。

public  static String[] getMBeanAppsStatus(String host, String port, 
                                          String container, String filter, 
                                          String usr, String pwd) {
    String Output[] = new String[3];
    int mbeanAppsIdx = 0;
    int LVar = mbeanAppsIdx;
    try {
        Object[] connections = 
            connectMethd(host, port, container, filter, usr, pwd);

        MBeanServerConnection serverConn = 
            (MBeanServerConnection)connections[0];
        System.out.println("serverConn from array variable in getMBeanAppsStatus" + 
                           serverConn);
        /* retrieve mbean apps matching given filter */
        ObjectName mbeanDomainName = new ObjectName(filter);
        Set mbeanAppNames = serverConn.queryNames(mbeanDomainName, null);
        /* pattern to extract mbean application names */
        Pattern mbeanAppPat = 
            Pattern.compile("name=", Pattern.CASE_INSENSITIVE);

        /* mbean application name */
        ObjectName mbeanApp = null;

        /* retrieve mbean apps count */
        Iterator i;
        for (i = mbeanAppNames.iterator(); i.hasNext(); ) {
            mbeanAppsIdx++;
            System.out.println("Populating MBean App #" + mbeanAppsIdx + 
                               "details...");
            /* retrieve mbean app name and status */
            mbeanApp = (ObjectName)i.next();
            String mbeanAppFQDN = mbeanApp.toString();
            String mbeanAppName = mbeanAppPat.split(mbeanAppFQDN)[1];
            Boolean mbeanAppRunning = 
                Boolean.valueOf(serverConn.getAttribute(mbeanApp, 
                                                        "Running").toString());
            String mbeanAppStatus = "DISABLED";
            if (mbeanAppRunning.booleanValue())
                mbeanAppStatus = "ENABLED";
            Output[0] = mbeanAppName;
            Output[1] = mbeanAppFQDN;
            Output[2] = mbeanAppStatus;
            System.out.println("getMBeanAppsStatus output " + 
                               "mbeanAppName " + mbeanAppName + 
                               " mbeanAppFQDN " + mbeanAppFQDN + 
                               " mbeanAppStatus : " + mbeanAppStatus);

        }

    } catch (MalformedObjectNameException e) {

        e.getStackTrace();
    } catch (InstanceNotFoundException e) {

        e.getStackTrace();
    } catch (AttributeNotFoundException e) {

        e.getStackTrace();
    } catch (ReflectionException e) {

        e.getStackTrace();
    } catch (MBeanException e) {
        e.getStackTrace();
    } catch (IOException ioe) {
        System.out.println(ioe);
    }

    System.out.println("getMBeanAppsStatus Output " + Output);
    return Output;
}

基本上,我正在尝试将上述方法转换为 J2EE Web 服务,并且来自 Web 服务的响应将是该方法的 Output 的返回值。

我在方法中有 2 个问题,我想纠正它。

1)想要连接 , 和 的值mbeanAppNamembeanAppFQDNmbeanAppStatus用逗号, 分隔并分配给数组变量。

2)返回应该包含所有先前值的数组结果。

4

1 回答 1

1

您只会看到最后一个输出,因为在每次迭代中,您都会用当前输出覆盖之前的输出。

  1. 您可以使用 aStringBuilder来连接mbeanAppNamembeanAppFQDNmbeanAppStatus用逗号分隔,。这可以通过以下方式完成:

       StringBuilder sb = new StringBuilder();
    
       /* Declare and initialise variables somewhere in between*/
    
       sb.append(mbeanAppName);
       sb.append(",");
       sb.append(mbeanAppFQDN);
       sb.append(",");
       sb.append(mbeanAppStatus);
    
       String generatedStringOutputFromStringBuilder = sb.toString();
    
  2. 您可以使用 aList来存储每次迭代后的输出。与数组不同,aList可以改变大小。当你初始化它时,你不必声明它。将输出添加到List每次迭代时创建的。例如:

       List<String> output = new ArrayList<String>();
    
       /* Declare and initialise variables somewhere in between*/
    
       output.add(generatedStringOutputFromStringBuilder);
    

这是更正后的样本,应该让您朝着正确的方向前进。

public  static List<String> getMBeanAppsStatus(String host, String port, 
                                          String container, String filter, 
                                          String usr, String pwd) {
    // A new List
    List<String> output = new ArrayList<String>();

    //A StringBuilder that will be used to build each ouput String
    StringBuilder sb = new StringBuilder();

    int mbeanAppsIdx = 0;
    int LVar = mbeanAppsIdx;
    try {
        Object[] connections = connectMethd(host, port, container, filter, usr, pwd);

        MBeanServerConnection serverConn = (MBeanServerConnection)connections[0];

        System.out.println("serverConn from array variable in getMBeanAppsStatus" + serverConn);

        /* retrieve mbean apps matching given filter */
        ObjectName mbeanDomainName = new ObjectName(filter);
        Set mbeanAppNames = serverConn.queryNames(mbeanDomainName, null);

        /* pattern to extract mbean application names */
        Pattern mbeanAppPat = Pattern.compile("name=", Pattern.CASE_INSENSITIVE);

        /* mbean application name */
        ObjectName mbeanApp = null;

        /* retrieve mbean apps count */
        Iterator i;
        for (i = mbeanAppNames.iterator(); i.hasNext(); ) {

            mbeanAppsIdx++;
            System.out.println("Populating MBean App #" + mbeanAppsIdx + "details...");

            /* retrieve mbean app name and status */
            mbeanApp = (ObjectName)i.next();

            String mbeanAppFQDN = mbeanApp.toString();
            String mbeanAppName = mbeanAppPat.split(mbeanAppFQDN)[1];
            Boolean mbeanAppRunning = Boolean.valueOf(serverConn.getAttribute(mbeanApp, "Running").toString());
            String mbeanAppStatus = "DISABLED";

            if (mbeanAppRunning.booleanValue())
                mbeanAppStatus = "ENABLED";

            // Construct the output using a string builder as
            //      mbeanAppName,mbeanAppFQDN,mbeanAppStatus
            sb.append(mbeanAppName);
            sb.append(",");
            sb.append(mbeanAppFQDN);
            sb.append(",");
            sb.append(mbeanAppStatus);

            // Store the current ouput in the List output
            output.add(sb.toString());

            // Empty string builder
            sb.setLength(0)

            System.out.println("getMBeanAppsStatus output " + 
                               "mbeanAppName " + mbeanAppName + 
                               " mbeanAppFQDN " + mbeanAppFQDN + 
                               " mbeanAppStatus : " + mbeanAppStatus);

        }

    } catch (MalformedObjectNameException e) {

        e.getStackTrace();
    } catch (InstanceNotFoundException e) {

        e.getStackTrace();
    } catch (AttributeNotFoundException e) {

        e.getStackTrace();
    } catch (ReflectionException e) {

        e.getStackTrace();
    } catch (MBeanException e) {
        e.getStackTrace();
    } catch (IOException ioe) {
        System.out.println(ioe);
    }

    System.out.println("getMBeanAppsStatus Output " + output);
    return output;
}
于 2014-05-09T21:48:57.473 回答