Vinnaren i pepparkakshustävlingen!
2016-10-13, 04:05
  #1
Medlem
Hej har en skoluppgift jag inte får till det på alls trots otaliga försök samt youtube videos mm...
Iaf så är uppgiften att skriva ett bankprogram. I detta bankprogram skall alla metoder vara privata samt ligga i en annan class än själva programmet gör.

Problemet jag har är att jag inte lyckas anropa metoderna oavsett hur jag en försker få bort dem...

här är min nuvarande kod som är den senaste jag testat vilket skall funka enligt youtube men jag får det inte att funka

Kod:
package labb4;

import java.util.Scanner;
import java.lang.reflect.Method;

class Bank{
	//Main funktionen
   public static void main(String[] args){

	   Scanner scanner = new Scanner(System.in);	
	   String nbr ;
	   double saldoSvar;
	   
	   
	   Class c=Class.forName("Bankkonto"); 
		Object obj=c.newInstance(); 
		Method m=c.getDeclaredMethod("insättning","uttag","visaSaldo",null); 
		m.setAccessible(true); 
		m.invoke(obj, null); 
	   	   
	   
	  Bankkonto konto = new Bankkonto(0.00);
      
	   
      System.out.println("Välkommen till bankprogrammet Tryck 1 för att utföra ett automatiskt programtest eller annan knapp för att starta det");                 
      nbr = scanner.next();
      
      while (!nbr.equals("j")) { 

      if( nbr.equals("1")) {
      //Testar genom att först ta ut och sen sätta in
    	  	System.out.println("Testar programmets funktioner");      
    	  	System.out.println("Sätter in 10001");
      		konto.insättning(10001.00);
      		saldoSvar = konto.visaSaldo();
      		System.out.println("Kontots saldo: " + saldoSvar);       
      		System.out.println("Tar ut 10000");     
      		konto.uttag(10000.00);
      		saldoSvar = konto.visaSaldo();
      		System.out.println("Kontots saldo: " + saldoSvar);  
      		System.out.println("Testar att ta 10000 igen vilket då ej går pga för lågt saldo");
      		konto.uttag(10000.00);
      		saldoSvar = konto.visaSaldo();
		    System.out.println("Tömmer kontot");
		    konto.uttag(1.00);
	        saldoSvar = konto.visaSaldo();
      		System.out.println("Kontots saldo: " + saldoSvar); 
      		} 

        	  		
	    	   if( nbr.equals("2"))
	    	   		{
	    		   	System.out.println("Skriv in inssättningsbelopp");
	    		   	double q = scanner.nextDouble();   
	    		   	konto.insättning(q);
	    		   	saldoSvar = konto.visaSaldo();
	    		   	System.out.println("Kontots saldo: " + saldoSvar); 
	    	   		}
	    	   
	    	   	else if( nbr.equals("3"))
	    	   			{
	    	   			System.out.println("Skriv in uttagssbelopp");
	    	   			double q = scanner.nextDouble();   
	    	   			konto.uttag(q);
	    	   			saldoSvar = konto.visaSaldo();
	    	   			System.out.println("Kontots saldo: " + saldoSvar); 
	    	   			}
	      
	    	   	else
	    	   		{
	    	   			System.out.println("Skriv in ett korrektvärde");
	    	   		}
	    	      System.out.println("Tryck 1 för att utföra ett automatiskt programtest, 2 För insättning samt 3 för uttag, Avsluta programmet med j");                 
	    	      nbr = scanner.next();
          }		
          }

    	  
}
     
            	   
//Klassen Bankkonto
public class Bankkonto{
	private double saldo;                            
   
   //Konstruktor Konto
   private Bankkonto(double startBelopp){
	      saldo = startBelopp;
	      
	   } 
 
 //Metoden insättning
   private void insättning(double belopp){
      saldo = saldo + belopp;
   } 
 
   
 //Metoden uttag
   private void uttag(double belopp){
      double nyttSaldo = saldo - belopp;
      if (nyttSaldo < 0) 
         System.out.println("Du har bara " + saldo + " kronor.");
      else
         saldo = nyttSaldo;
   }
 
 //Metoden visaSaldo
   private double visaSaldo(){
      return saldo;
   } 
 
} 

// Eldritched
Citera
2016-10-13, 07:27
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av Eldritched
Hej har en skoluppgift jag inte får till det på alls trots otaliga försök samt youtube videos mm...
Iaf så är uppgiften att skriva ett bankprogram. I detta bankprogram skall alla metoder vara privata samt ligga i en annan class än själva programmet gör.

Problemet jag har är att jag inte lyckas anropa metoderna oavsett hur jag en försker få bort dem...

här är min nuvarande kod som är den senaste jag testat vilket skall funka enligt youtube men jag får det inte att funka

Kod:
package labb4;

import java.util.Scanner;
import java.lang.reflect.Method;

class Bank{
	//Main funktionen
   public static void main(String[] args){

	   Scanner scanner = new Scanner(System.in);	
	   String nbr ;
	   double saldoSvar;
	   
	   
	   Class c=Class.forName("Bankkonto"); 
		Object obj=c.newInstance(); 
		Method m=c.getDeclaredMethod("insättning","uttag","visaSaldo",null); 
		m.setAccessible(true); 
		m.invoke(obj, null); 
	   	   
	   
	  Bankkonto konto = new Bankkonto(0.00);
      
	   
      System.out.println("Välkommen till bankprogrammet Tryck 1 för att utföra ett automatiskt programtest eller annan knapp för att starta det");                 
      nbr = scanner.next();
      
      while (!nbr.equals("j")) { 

      if( nbr.equals("1")) {
      //Testar genom att först ta ut och sen sätta in
    	  	System.out.println("Testar programmets funktioner");      
    	  	System.out.println("Sätter in 10001");
      		konto.insättning(10001.00);
      		saldoSvar = konto.visaSaldo();
      		System.out.println("Kontots saldo: " + saldoSvar);       
      		System.out.println("Tar ut 10000");     
      		konto.uttag(10000.00);
      		saldoSvar = konto.visaSaldo();
      		System.out.println("Kontots saldo: " + saldoSvar);  
      		System.out.println("Testar att ta 10000 igen vilket då ej går pga för lågt saldo");
      		konto.uttag(10000.00);
      		saldoSvar = konto.visaSaldo();
		    System.out.println("Tömmer kontot");
		    konto.uttag(1.00);
	        saldoSvar = konto.visaSaldo();
      		System.out.println("Kontots saldo: " + saldoSvar); 
      		} 

        	  		
	    	   if( nbr.equals("2"))
	    	   		{
	    		   	System.out.println("Skriv in inssättningsbelopp");
	    		   	double q = scanner.nextDouble();   
	    		   	konto.insättning(q);
	    		   	saldoSvar = konto.visaSaldo();
	    		   	System.out.println("Kontots saldo: " + saldoSvar); 
	    	   		}
	    	   
	    	   	else if( nbr.equals("3"))
	    	   			{
	    	   			System.out.println("Skriv in uttagssbelopp");
	    	   			double q = scanner.nextDouble();   
	    	   			konto.uttag(q);
	    	   			saldoSvar = konto.visaSaldo();
	    	   			System.out.println("Kontots saldo: " + saldoSvar); 
	    	   			}
	      
	    	   	else
	    	   		{
	    	   			System.out.println("Skriv in ett korrektvärde");
	    	   		}
	    	      System.out.println("Tryck 1 för att utföra ett automatiskt programtest, 2 För insättning samt 3 för uttag, Avsluta programmet med j");                 
	    	      nbr = scanner.next();
          }		
          }

    	  
}
     
            	   
//Klassen Bankkonto
public class Bankkonto{
	private double saldo;                            
   
   //Konstruktor Konto
   private Bankkonto(double startBelopp){
	      saldo = startBelopp;
	      
	   } 
 
 //Metoden insättning
   private void insättning(double belopp){
      saldo = saldo + belopp;
   } 
 
   
 //Metoden uttag
   private void uttag(double belopp){
      double nyttSaldo = saldo - belopp;
      if (nyttSaldo < 0) 
         System.out.println("Du har bara " + saldo + " kronor.");
      else
         saldo = nyttSaldo;
   }
 
 //Metoden visaSaldo
   private double visaSaldo(){
      return saldo;
   } 
 
} 

// Eldritched
Just raden
Kod:
Method m=c.getDeclaredMethod("insättning","uttag","visaSaldo",null); 
ser ju misstänkt ut i sammanhanget, vad ska den göra?

Kollar man i javadokumentationen ser man att metoden tar en string som ska identifiera metoden man vill få tag på, samt en eller flera typer som metoden kan ta som argument, men du skickar in en massa strängar och null?

Det förstår jag inte, tydligen gör inte java det heller.

https://docs.oracle.com/javase/7/doc....lang.Class...)
Citera
2016-10-13, 23:39
  #3
Medlem
Brunbeverns avatar
Bankkonto konto = new Bankkonto(0.00);
^
Det lär inte fungera.
Citera
2016-10-14, 08:17
  #4
Moderator
Protons avatar
Citat:
Ursprungligen postat av Brunbevern
Bankkonto konto = new Bankkonto(0.00);
^
Det lär inte fungera.
Jaså, varför inte?
Citera
2016-10-14, 15:05
  #5
Moderator
Neksnors avatar
Hela grejen med privata metoder är väl att man inte ska kunna anropa dem från andra klasser? Så hur tänkte du dig att man ska kunna göra något med ditt Bankkonto? Och varför en privat konstruktor?
Citera
2016-10-14, 15:53
  #6
Moderator
Protons avatar
Citat:
Ursprungligen postat av Neksnor
Hela grejen med privata metoder är väl att man inte ska kunna anropa dem från andra klasser? Så hur tänkte du dig att man ska kunna göra något med ditt Bankkonto? Och varför en privat konstruktor?
Med reflection kan du ju overrida visibility, det är det hela övningen syftar till misstänker jag.
Citera
2016-10-14, 15:54
  #7
Moderator
Protons avatar
Citat:
Ursprungligen postat av Brunbevern
Bankkonto konto = new Bankkonto(0.00);
^
Det lär inte fungera.

Citat:
Ursprungligen postat av Proton
Jaså, varför inte?
Ah, nu såg jag. My bad.
Citera
2016-10-14, 16:42
  #8
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av Proton
Med reflection kan du ju overrida visibility, det är det hela övningen syftar till misstänker jag.
Ah. Jag hoppade över första delen när jag läste Scanner och insåg att det finns en massa I/O som antagligen saknar betydelse för uppgiften.
Citera
2016-10-14, 17:19
  #9
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av Proton
Med reflection kan du ju overrida visibility...

Så länge ingen SecurityManager har installerats under runtime i en JVM ja. Dvs det funkar bra i en labbmiljö, men inte i en korrekt uppsatt produktionsmiljö (om inte någon har klantat sig kopiöst).

http://docs.oracle.com/javase/8/docs...tyManager.html

Om övningen var till för att träna Reflections kan det väl vara ok.

Reflections är fantastiskt användbart för att bygga olika verktyg för utveckling och för att bygga teststöd med, men undvik det i skarpa applikationer. Kom ihåg, kompilatorn är din vän och hjälper dig att hitta buggar under compiletime istället för runtime.
Citera
2016-10-14, 17:51
  #10
Medlem
kjellbrels avatar
För att hjälpa till lite med grundfrågan så känns det som om du behöver förstå lite mer i detalj hur Reflections fungerar. Har inte detaljläst koden du postade, men alla försök som görs med att anropa Bankkonto-metoderna direkt kommer ju kompilatorn att slå ned på. Det enda försöket till Reflectionsanrop du gör innehåller ett flertal fel.

Du behöver sätta dig ned och läsa på hur metoderna getDeclaredMethod och invoke fungerar i detalj och exakt villka parametrar de förväntar sig för att det skall fungera. Här nedan är ett minimalt exempel som anropar en privat metod via reflections i en annan klass. Hoppas den hjälper dig lite på vägen i dina studier.

Kod:
import java.lang.reflect.Method;

public class T {
    public static void main(String[] args) throws Exception {
        Class<A> c = A.class;
        Method m = c.getDeclaredMethod("secret", new Class[] {int.class});
        m.setAccessible(true);
        m.invoke(new A(), Integer.valueOf(42));
    }
}

class A {
    @SuppressWarnings("unused") // just one drawback of using Reflections!
    private void secret(int value) {
        System.out.println("The answer is: " + value);
    }
}

Notera också att mitt förenklade exempel inte har en privat konstruktor för A, så new A() fungerar här, men det kommer det inte att göra i ditt fall. Men ta en sak i taget. När du har förstått och löst metodanropen är du säkert redo att lösa fallet med den privata konstruktorn också.
Citera
2016-10-26, 00:03
  #11
Medlem
Du har inte lust att slänga upp uppgiftsbeskrivningen?
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback