Java 无法从接口实例化类

Java 无法从接口实例化类,java,Java,我正在构建的应用程序中有以下界面: package sistemata; public interface PaymentgatewayAdapter { public String postPayment(String a); } 下面的类实现了它: public class PaypalAdapter implements PaymentgatewayAdapter { public String postPayment(String a) {

我正在构建的应用程序中有以下界面:

package sistemata;

public interface PaymentgatewayAdapter
{   
    public String postPayment(String a);
}
下面的类实现了它:

public class PaypalAdapter implements PaymentgatewayAdapter
{
    public String postPayment(String a)
    {

        String payAmount;
        String transactionOutcome;
        String response;
        payAmount = a;

        Paypal_sim systemGN = new Paypal_sim();
        System.out.println("v adaptera" + a);
        //Simulerar att data skickas till externa systemet
        response = systemGN.transferSaleData(payAmount);

        if (response == "OK")
        {
            transactionOutcome = "OK";
        }
        else
        {
            transactionOutcome = "Invalid data sent to MasterCard.";
        }

        return transactionOutcome;
        //------------------------------
    }
}
还有第二个几乎相同的类叫Payson,但它没有被使用。 此接口是
服务工厂的一部分

package sistemata;

public class ServicesFactory
{
    private static ServicesFactory instance;
    private PaymentgatewayAdapter paymentAdapter;

    private String className2;

    public static synchronized ServicesFactory getInstance()
    {
        instance = new ServicesFactory();
        return instance;
    }


    public PaymentgatewayAdapter getPaymentAdapter(String className2) 
    {
        this.className2 = className2;

        if (paymentAdapter == null)
        {
            try
            {
                paymentAdapter = (PaymentgatewayAdapter)
                        Class.forName(className2).newInstance();
            }
            catch (Exception e)
            {
                System.out.println("ERROR: Cannot instantiate: " +
                        className2 + ".");
                e.printStackTrace();
                System.exit(1);
            }
        }
        return paymentAdapter;  
    }
}
方法
getPaymentAdapter
Account
类中调用,如下所示:

else if (paymentMethod == 0)
{
    System.out.println("The payment method is PayPal INC");
    String className = "PaypalAdapter";
    paymentAdapter = ServicesFactory.getInstance().getPaymentAdapter(className);
}
每当我打电话:

paymentAdapter = ServicesFactory.getInstance().getPaymentAdapter(className);
我得到了在
System.out.println中抛出的错误(“错误:无法实例化:。
无论我尝试什么,我都无法解决这个问题,也找不到解决方案。我将感谢您对这段代码的帮助,甚至是对硬代码的建议

java.lang.ClassNotFoundException: PaymentgatewayAdapter
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at sistemata.ServicesFactory.getPaymentAdapter(ServicesFactory.java:26)
    at sistemata.Account.makePayment(Account.java:56)
    at sistemata.MainSystem.main(MainSystem.java:71)

您忘了此行的包裹名称了吗

String className = "PaypalAdapter";
应该是吗

String className = "sistemata.x.y.z.PaypalAdapter";

您忘了此行的包裹名称了吗

String className = "PaypalAdapter";
应该是吗

String className = "sistemata.x.y.z.PaypalAdapter";


传递给
class.forName()
的类名必须是完全限定的类名,包括包。请尝试使用“sistema.PaypalAdapter”。

传递给
class.forName()
的类名必须是完全限定的类名,包括包。请尝试使用“sistema.PaypalAdapter”".

您是否显示了所有用于
PaypalAdapter
的构造函数(如果有)?以及堆栈跟踪的下一步内容?您可以添加Stacktrace吗?您自定义的错误消息远没有您打印的Stacktrace有用。请发布Stacktrace。是的,所有重要的构造函数都在这里,主要目的是即时消息plement ProtectedVariations,并且以这种方式-有两个外部方法用于支付您需要使用完全限定名和
Class.forName()
您是否显示了所有用于
PaypalAdapter
的构造函数(如果有的话)?以及堆栈跟踪的下一步内容?您可以添加Stacktrace吗?您自定义的错误消息远没有您打印的Stacktrace有用。请发布Stacktrace。是的,所有重要的构造函数都在这里,主要目的是实现ProtectedVariations,并以这种方式-有两种外部方法用于支付您需要使用完全限定名和
Class.forName()
最好使用
PaypalAdapter.Class.getName()
IMHO@RC如果您要使用类文本,您最好只使用
newInstance()
你自己就在那里。@RC Yes,或者甚至可能
public PaymentgatewayAdapter getPaymentAdapter(Class clazz)
然后在当前上下文中传递
PaypalAdapter.Class
TomG,但我同意。vikingsteve事件更好:)Yes,我完全看不见它-它需要文件夹.Classname。我一直在关注令人困惑的抽象类,而没有检查这个:XIt最好使用
PaypalAdapter.class.getName()
IMHO@RC如果您要使用类文字,您最好自己在那里
newInstance()
,或者在当前上下文中,甚至可以
publicpaymentgatewayadapter getPaymentAdapter(Class clazz)
然后传递
PaypalAdapter.Class
TomG,但我同意。vikingsteve event better:)是的,我完全失明了-它需要文件夹。Classname一直以来我都在关注令人困惑的抽象类insead检查这个:xahh我只是不相信我有多瞎,我真的错过了这个-现在一切都很好啊,我只是不相信我有多瞎,我真的错过了这个-现在一切都很好