java.lang.ClassNotFoundException:SavingAccount

时间:2012-09-23 09:48:21

标签: java reflection

  

可能重复:
  ClassnotFound exception using java reflection

我在执行以下代码时遇到异常java.lang.ClassNotFoundException: SavingAccount

public class AccountFactory {   
    public void getAccount()
    {
        IAccount account;
        account = null;
     try
        {
         account = (IAccount)Class.forName("SavingAccount").newInstance();
         account.Deposit(500);
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        }  
    }

}

导致错误的可能原因是什么?

这是我的保存帐户代码:

public class SavingAccount implements IAccount {
    int money;
    SavingAccount()
    {
        money =0;
    }
    public void WithDraw(int m)
    {
        money--;
    }
    public void Deposit(int m)
    {
        money++;
        System.out.println(money);
    }
}

5 个答案:

答案 0 :(得分:4)

类加载器找不到SavingsAccount类。在使用Java API中指定的Class.forName方法时,还需要使用类的完全限定名称。完全限定的类名称包括以包结构为前缀的类名。如果您的AccountFactory类每次都要创建一个类型为SavingsAccount的类,我建议不要使用AccountFactory类,而只是使用:

IAccount account = new SavingsAccount();

如果发布的代码只是您的类的快照,并且您打算从工厂返回实现IAccount接口的不同类型,则需要更改getAccount方法签名,以便它返回IAccount而不是void。然后,您必须使用return语句返回实现IAccount接口的对象。如:

 public IAccount getAccount()
 {
     IAccount account;
     account = null;
     try
        {
         //Notice fully qualified name is used.
         account = (IAccount)Class.forName("org.mydomain.SavingAccount").newInstance();
         account.Deposit(500);
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        } 
     return account;
}

答案 1 :(得分:1)

尝试指定完全限定的类名。像

的Class.forName( “abc.xyz.SavingAccount”);

其中abc.xyz是SavingAccount类的包名。

答案 2 :(得分:1)

您的AccountFactory必须已超过IAccount。我认为它用于根据请求返回IAccount的所有实现的实例。但是,我假设您知道所有类正在实现您的IAccount。因此,不需要使用Class.forName()。

我认为你的设计就像下面给出的那样: -

public interface IAccount {
}

public class SavingsAccount implements IAccount {
}

public class CurrentAccount implements IAccount {

}

public class AccountFactory {
     public static IAccount getAccountInstance(String class) {   
     // In your code you need to change the return type of this method..

          if (class.equals("Savings")) {
                 return new SavingAccounts();
          } else if (class.equals("Current")) {
                 return new CurrentAccount();
          } 
          // Similarly for Other implementor....
     }
}

答案 3 :(得分:0)

它显示SavingAccount上没有classpath类。

答案 4 :(得分:0)

public class AccountFactory {   
    public void getAccount()
    {
        IAccount account;
        account = null;
     try
        {
         account = new SavingAccount();
         account.Deposit(500);
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        }  
    }        
}

并遵循编译错误。

  1. 您可能会看到为什么找不到SavingAccount(不在类路径中?错误的包(即“mypackage.SavingAccount”?))
  2. 您会看到SavingAccount是否实现了IAccount imterface。