2017-01-11 2 views
-2

Ich habe ein Problem, ich kann nicht meinen Kopf wickeln, und hoffe, jemand kann mir helfen. Im Wesentlichen habe ich eine Hash-Nachricht und eine Signatur. Um es zu überprüfen, muss ich eine Methode in einer anderen Klasse mit Signing.verify(hash, signature) aufrufen. Die Schnittstelle, die auch für andere Signaturen verwendet wird, daher kann sie nicht geändert werden, verbietet statische Methoden, aber Java sagt mir entweder, dass die Methode statisch wird oder ich kann sie nicht verifizieren. Ich bin ziemlich neu in Java, aber ich hoffe, dass mir jemand helfen kann. Wenn das Problem bereits aufgetreten ist, tut es mir leid, aber ich habe nichts gefunden. Mit freundlichen Grüßen, und vielen Dank für Ihre Zeit.Java-Schnittstelle-statische Methode Anruf

EDIT: Sorry-das ist irgendwie kompliziert. Das Verfahren, das in der gleichen Verpackung, sieht aus wie this- und wird später programmiert werden:

public class Signature implements SIG{ 
    public boolean verify(String message, String signature){ 
     //deadcode 
     return true; 
    } 
} 

Mein Code sieht wie folgt aus:

public class SignatureTree implements Tree{ 
    public boolean verify(String message, String signature, String hash){ 
      byte[] publicKey=extractPK(signature); 
      if(Signature.verify(message,signature)==false){ 
        System.err.println("SIGNATURE VERIFICATION FAILED"); 
      } 
      //some other stuff 
    } 
} 

jedoch Eclipse sagt mir Methode die überprüfen ändern in Signature zu einer statischen Methode - die von der Schnittstelle verboten ist. Ist das klarer? Tut mir leid, ich bin eher ein C-Programmierer. Vielen Dank.

+5

Wie ... ohne Code vorhanden ... Was denkst du sind wir, Hellseher ??? Wenn eine Methode nicht statisch ist, müssen Sie sie über eine Instanz der Klasse aufrufen. Das ist soweit Ihre Frage beantwortet werden kann! –

+0

Willkommen bei stackoverflow! Ihre Frage ist derzeit ziemlich unklar. Sie sollten hier nachlesen, wie Sie eine gute Frage stellen können: http://stackoverflow.com/help/how-to-ask –

+0

Bitte senden Sie einen Beispielcode, damit wir Ihnen helfen können. – Aradhna

Antwort

0

Frage noch nicht 100% klar, aber von was ich verstehen kann, sollten Sie eine andere Klasse finden, die diese Schnittstelle implementiert.

Eine weitere Option, Totalen, wird wahrscheinlich nicht funktionieren:

if(new Signature().verify(message,signature) == false) { // fail code here }

Dieser Code würde Unterschrift übernehmen keine Schnittstelle ist, though.

+0

Sorry - aber deine Idee hat funktioniert! Vielen Dank. – junie

+0

Vergessen Sie nicht, als Antwort und Upvote wählen;) –

+0

Ich habe nicht genug Ruf zu verbessern, sorry (ich versuchte obwohl - wenn ich genug habe, werde ich wiederkommen!) – junie

0

Vielleicht möchten Sie über die Klassen und ihre Mitglieder in Java lesen: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

See, eine Klasse ist so etwas wie eine „Vorlage für Objekte“, und Sie ein Objekt einer bestimmten Klasse instanziiert können. Zum Beispiel wollen wir eine einfache Klasse erstellen:

class MyClass { 
    public int var; 

    public MyClass(int var) { 
     this.var = var; 
    } 

    public void incrementVar() { 
     var = var + 1; 
    } 

    public static boolean isSmallerThanTen(int toTest) { 
     return (toTest < 10); 
    } 
} 

Jetzt können Sie Objekte erstellen, die Instanzen von MyClass sind:

MyClass firstObject = MyClass(3); 
MyClass secondObject = MyClass(10); 

Und Sie können die incrementVar() Methode auf einem einzelnen Objekt aufrufen:

firstObject.incrementVar(); 

Jetzt ist firstObject.var 4, aber das zweite Objekt wurde nicht berührt, secondObject.var ist immer noch 10.

Aber dann haben Sie diese Methode isSmallerThanTen(), die unabhängig von den Eigenschaften einer bestimmten Instanz ist, können Sie MyClass.isSmallerThanTen(5) aufrufen. Sie können jedoch MyClass.incrementVar() nicht aufrufen, da incrementVar() nicht statisch ist, sondern nur für eine Instanz von MyClass aufgerufen werden kann, nicht für die Klasse selbst.

Und das ist genau das Problem, das Sie haben, Signature.verify() ist nicht statisch, was bedeutet, dass Sie es auf eine Instanz von Signature aufrufen müssen, nicht auf die Klasse selbst.

So sind die beiden folgenden Lösungen sollten beide arbeiten, da sie beide ein Objekt von Signature instanziiert:

if(new Signature().verify(message,signature) == false){ 
    ... 

und

Signature sig = new Signature(); 
if(sig.verify(message, signature) == false) { 
    ... 

Btw: Sie können auch diese als if(!sig.verify(message, signature)) schreiben, die ! ist ein logisches "not", invertiert den booleschen Wert.

+0

danke, es hat ziemlich viel geholfen (: – junie

Verwandte Themen