Java 尝试动态实例化类

Java 尝试动态实例化类,java,inheritance,casting,factory-pattern,jsch,Java,Inheritance,Casting,Factory Pattern,Jsch,我正试图使用这个类与服务器建立连接。此类获取对HashMaps中的图像执行操作所需的参数列表。然后在doInBackground中,我对图像逐个执行所需的操作。下面还粘贴了OVFImage部署器类的代码 public class ImageDeployer extends SwingWorker<Boolean,String> { public ImageDeployer(){ } public ImageDeployer(HashMap<Str

我正试图使用这个类与服务器建立连接。此类获取对HashMaps中的图像执行操作所需的参数列表。然后在doInBackground中,我对图像逐个执行所需的操作。下面还粘贴了OVFImage部署器类的代码

public class ImageDeployer extends SwingWorker<Boolean,String> {


    public ImageDeployer(){

    }

    public ImageDeployer(HashMap<String, String> volIDMap, HashMap<String, String> osMap) {
    // TODO Auto-generated constructor stub
    this.volIDMap = volIDMap;
    this.osMap = osMap;
    System.out.println(volIDMap);
    System.out.println(osMap);
    makeAConnection();
    try {
        doInBackground();
        System.out.println("Do In Background");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


public void makeAConnection(){

    inputFile = RESTEngine.getFilePath();
    Properties defaultProps = new Properties();
    try {
        fin = new FileInputStream(inputFile);
        defaultProps.load(fin);
        fin.close();
    }
    catch(FileNotFoundException e1){
        System.out.println("The properties file supposed to contain Authorization parameters was not found.");
        e1.printStackTrace();
        System.exit(-1); 
    }
    catch(IOException e1){
        System.out.println("An exception occured while trying to open the properties file");
        e1.printStackTrace();
        System.exit(-1);
    }
    // assign variables from Input file with default value as null
    user = defaultProps.getProperty("UserID", null);
    host = defaultProps.getProperty("PowerVC_IP_ADDRESS", null);
    password = defaultProps.getProperty("UserPass" ,null );

    jsch = new JSch();
    try {
        session = jsch.getSession(user, host, 22);
        session.setPassword(password);
        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        channel=session.openChannel("exec");
        channel.setInputStream(null);

        try {
            in = channel.getInputStream();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("Connection Successful");
    } catch (JSchException e) {
        // TODO Auto-generated catch block
        System.out.println("Unable to connect");
        e.printStackTrace();
    }

}


@Override
protected Boolean doInBackground() throws Exception {

    ImageDeployer imageDeployer = new ImageDeployer();
    imageDeployer.makeAConnection();

    for(String imageName : volIDMap.keySet()){

        String volID = volIDMap.get(imageName);
        String oS = osMap.get(imageName);
        if (oS.equalsIgnoreCase("aix")){

            imageDeployer = new OVFImageDeployer(volID, oS, imageName);

        }
        // Other Cases depending upon the OS Type


    }
    return null;



}
}
现在,当我运行代码时,我在
((ChannelExec)channel.setCommand(command)
行上得到一个
NullPointerException

我知道,如果我在
OVFImageDeployer
中的try块后放置
makeAConnection
,代码将正常工作,但我不想一次又一次地建立连接。我希望只初始化一次连接,并且只使用该连接执行所有操作。

您应该从
ImageDeployer
的构造函数中删除对
doInBackground
的调用:

public ImageDeployer(HashMap<String, String> volIDMap, HashMap<String, String> osMap) {
    ....
    makeAConnection();
    //doInBackground();
    ...
}
public OVFImageDeployer(String VolID,String oS,String imageName, Channel channel){

this.channel = channel;
...
}
@Override
protected Boolean doInBackground() throws Exception {

//ImageDeployer imageDeployer = new ImageDeployer();
//imageDeployer.makeAConnection();
...
ImageDeployer imageDeployer = new OVFImageDeployer(volID, oS, imageName, channel);
...
}
这将使用
ImageDeployer
实例中存在的
channel
创建一个
OVFImageDeployer
实例。您需要从
doInBackground
方法中删除这两条语句,并在构造
OVFImageDeployer
实例时传递
channel
以及其他参数:

public ImageDeployer(HashMap<String, String> volIDMap, HashMap<String, String> osMap) {
    ....
    makeAConnection();
    //doInBackground();
    ...
}
public OVFImageDeployer(String VolID,String oS,String imageName, Channel channel){

this.channel = channel;
...
}
@Override
protected Boolean doInBackground() throws Exception {

//ImageDeployer imageDeployer = new ImageDeployer();
//imageDeployer.makeAConnection();
...
ImageDeployer imageDeployer = new OVFImageDeployer(volID, oS, imageName, channel);
...
}
现在,客户端代码可以创建
ImageDeployer
的实例,并可以在其上执行
doInBackground

ImageDeployer imageDeployer = new ImageDeployer();
imageDeployer.doInBackground();

这样,每次在
doInBackground
方法中创建
OVFImageDeployer
的实例时,在构造
ImageDeployer
实例时,可以使用由
makeAConnection
方法创建的相同的
channel

应该从
ImageDeployer
的构造函数中删除对
doInBackground
的调用:

public ImageDeployer(HashMap<String, String> volIDMap, HashMap<String, String> osMap) {
    ....
    makeAConnection();
    //doInBackground();
    ...
}
public OVFImageDeployer(String VolID,String oS,String imageName, Channel channel){

this.channel = channel;
...
}
@Override
protected Boolean doInBackground() throws Exception {

//ImageDeployer imageDeployer = new ImageDeployer();
//imageDeployer.makeAConnection();
...
ImageDeployer imageDeployer = new OVFImageDeployer(volID, oS, imageName, channel);
...
}
这将使用
ImageDeployer
实例中存在的
channel
创建一个
OVFImageDeployer
实例。您需要从
doInBackground
方法中删除这两条语句,并在构造
OVFImageDeployer
实例时传递
channel
以及其他参数:

public ImageDeployer(HashMap<String, String> volIDMap, HashMap<String, String> osMap) {
    ....
    makeAConnection();
    //doInBackground();
    ...
}
public OVFImageDeployer(String VolID,String oS,String imageName, Channel channel){

this.channel = channel;
...
}
@Override
protected Boolean doInBackground() throws Exception {

//ImageDeployer imageDeployer = new ImageDeployer();
//imageDeployer.makeAConnection();
...
ImageDeployer imageDeployer = new OVFImageDeployer(volID, oS, imageName, channel);
...
}
现在,客户端代码可以创建
ImageDeployer
的实例,并可以在其上执行
doInBackground

ImageDeployer imageDeployer = new ImageDeployer();
imageDeployer.doInBackground();

这样,每次在
doInBackground
方法中创建
OVFImageDeployer
实例时,您都可以使用与构建
ImageDeployer
实例时由
makeAConnection
方法创建的相同的
channel
属性定义在哪里?是否在PowerVCImageDeployer中?是的,通道是通道类型的变量,是公共变量。我已经确保它不是特定于方法的,并在公共类ImageDeployer extends SwingWorker上面声明了它。并且您希望在构造
ImageDeployer
的实例时初始化
channel
,并且
ImageDeployer
实例上的所有方法调用都应该使用相同的
channel
?我说的对吗?是的,一次又一次地创建频道需要花费大量的时间和资源。您正在从内部
ImageDeployer
构造函数调用
doInBackground
,并且再次创建
ImageDeployer
内部
doInBackground
方法的实例。令人困惑您能解释一下原因吗?您的
频道
属性定义在哪里?是否在PowerVCImageDeployer中?是的,通道是通道类型的变量,是公共变量。我已经确保它不是特定于方法的,并在公共类ImageDeployer extends SwingWorker上面声明了它。并且您希望在构造
ImageDeployer
的实例时初始化
channel
,并且
ImageDeployer
实例上的所有方法调用都应该使用相同的
channel
?我说的对吗?是的,一次又一次地创建频道需要花费大量的时间和资源。您正在从内部
ImageDeployer
构造函数调用
doInBackground
,并且再次创建
ImageDeployer
内部
doInBackground
方法的实例。令人困惑你能解释一下原因吗?Thanx,这很有魅力。但现在它给了我一个新问题。SwingWorker只能执行一次。因此OVFImageDeployer只工作一次,不管for循环运行多少次(String-imageName:volIDMap.keySet())这个循环是nowThanx的新谜题,它就像一个符咒一样工作。但现在它给了我一个新问题。SwingWorker只能执行一次。因此OVFImageDeployer只工作一次,不管for循环运行多少次(字符串imageName:volIDMap.keySet())这个循环现在是新的难题