[Java] String naar methode

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Ik ben een client-server applicatie aan het maken. Het is de bedoeling dat de clients methodes kan aanroepen die in server staan. Dit zal verre van optimaal zijn maar voor een klein schaalig schoolproject als dit voldoende.

Nu verstuur ik met een outputstream gewoon de methode bv. getinfo(truus).
Dit komt ook gewoon aan bij servers als inputstream getinfo(truus).
Hoe zorg ik ervoor dat de server dit ziet als een methode (alles wat ik verzend is een methode)?

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Je bedoelt een soort __call-functionaliteit zoals in PHP?

Ik denk dat je gewoon moet kijken wat voor string je binnen krijgt, en dan zelf de daarbij behorende methode aanroepen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Ik had zelf inderdaad dit bedacht.

if (inputstream == getinfo(truus))
{
getinfo(truus);
}

Dit lijkt me geen nette oplossing.

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
eval() :+

(en, ja, eval is evil... als het puur om een 'kijk, het kan/werkt/mag ik een cijfer' gaat scheelt 't echter een boel gedoe ;) )

Ik zou deze suggestie niet eens moeten geven want 't is kneiter slecht en feitelijk wil je niet eens weten van 't bestaan van die functie. Maar goed.


8)7 Ik zou zweren dat ik PHP zag :X

[ Voor 48% gewijzigd door RobIII op 01-07-2009 19:51 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
RobIII schreef op woensdag 01 juli 2009 @ 19:49:
eval() :+

(en, ja, eval is evil... als het puur om een 'kijk, het kan/werkt/mag ik een cijfer' gaat scheelt 't echter een boel gedoe ;) )

Ik zou deze suggestie niet eens moeten geven want 't is kneiter slecht en feitelijk wil je niet eens weten van 't bestaan van die functie. Maar goed.


8)7 Ik zou zweren dat ik PHP zag :X
java kent toch ook eval?

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Sv3n
  • Registratie: Mei 2002
  • Laatst online: 10:10
Als je weet in welke classes de methods mogelijk staan kun je de methods van de classes op vragen: http://java.sun.com/j2se/...g/Class.html#getMethods() . Als je al die methods hebt kun je daar de goede uit selecteren en invoke aanroepen

Last.fm
Films!


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Wat je nodig hebt heet reflection. Daarmee kun je classes laden en methoden aanroepen. Maar eigenlijk moet je nog eens goed nadenken over je design als je denkt dat je dat nodig hebt. Normaalgesproken gebruiken alleen scripting engines, servlet containers, ORM-mappers etc. dit soort functionaliteit. Het verkeerd implementeren van dergelijke 'willekeurige-methode-aanroep'-functionaltieit kan voor gigantische beveiligingslekken zorgen...

Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Bedankt voor de hints. Ik heb het gevoel dat ik de juiste methode heb gevonden. Voornamelijk door Sv3n en MisterData kwam ik uit op de getMethode. Helaas door mijn gebrekkige kennis van programmeren kom ik er net niet uit.
Wat ik verwacht te moeten hebben:
code:
1
2
3
dbconnection verbinding = new dbconnection();
msg = getinfo(truus);
Method methode = verbinding.getMethod(msg);


Wat hij hopelijk ziet als; methode = verbinding.getinfo(truus);
Uiteraard werkt dit niet, alleen snap ik nog niet waarom.

De pagina's:

http://softwareas.com/reflecting-on-varargs
http://www.developer.com/java/ent/article.php/3507696
http://java.sun.com/j2se/...String,%20java.lang.Class[])

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 13:08

Acties:
  • 0 Henk 'm!

  • alx
  • Registratie: Maart 2002
  • Niet online

alx

Precies. Wat jij wilt is wat Java met RMI (Remote Method Invocation) al ondersteunt. Tenzij de schoolopdracht dit uitsluit om een educatieve reden, kun je dat beter gebruiken. Een standaard method call wordt dan remote uitgevoerd met de meegegeven parameters en het resultaat teruggevoerd. Alsof je het lokaal deed; behalve mbt de timing dan. :)

Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Ik ben al een half uurtje aan het kijken naar RMI, maar het is niet echt gemakkelijk voor een beginneling.

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Tja, nog een andere manier, die makkelijker te gebruiken is maar moeilijker om op te zetten: webservices.
Dan kun je echt helemaal makkelijk gewoon de code uitvoeren op de remote server. Mocht je het eens willen proberen kun je kijken naar Oracle internet application server 10g of weblogic.

[ Voor 10% gewijzigd door krvabo op 01-07-2009 21:53 ]

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Ik zou toch ff naar RMI kijken en ik denk dat dit wat simpeler is.. Gewoon een HelloWorld dingetje waardoor je het principe begrijpt.

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Bl4ckviper super bedankt! daar staat het helder en makkelijk uitgelegd.

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

No problemo.. Succes ;)

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 13:08
Bl4ckviper schreef op woensdag 01 juli 2009 @ 22:00:
Ik zou toch ff naar RMI kijken en ik denk dat dit wat simpeler is.. Gewoon een HelloWorld dingetje waardoor je het principe begrijpt.
Link jij nou serieus naar RoseIndia? :X
Als er toch één bagger slechte Java gerelateerde website is met afgrijselijke code samples dan is het die toko wel. Nou ja, als het de TS verder maar verder helpt :)

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Het is simpel daar ging het om ;) Kon wel verder zoeken heb niet eens echt goed gezocht.. Dit voorbeeld leek mij duidelijk dan die voorgaande link ;)

Zelf überhaupt die site nooit gezien tot net :D

Wat is er zo slecht aan dan?

[ Voor 21% gewijzigd door Bl4ckviper op 02-07-2009 00:02 ]

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Mammon
  • Registratie: December 2006
  • Laatst online: 24-08 20:45
Lees dit artikel is van balusc.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
BTW: Als je er toch voor kiest om met Strings te werken, zou je ook gebruik kunnen maken van een enum die de diverse commands bevat.

Bijvoorbeeld iets als:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum Command {
    COMMAND1 {
        public void execute() {
            //Do something
        }
    },
    
    COMMAND2 {
        public void execute() {
            //Do something else
        }
    };
    
    public abstract void execute();
}


Dat kan je dan vervolgens oproepen met:
Java:
1
2
3
4
5
6
7
String cmdString = getCommandSomehow().toUpperCase(); // make sure the casing matches the definition in Command
try {
    Command command = Enum.valueOf(Command, cmdString);
    command.execute();
} catch(IllegalArgumentException ex) {
    // Handle wrong command
}


Dat gezegd hebbende: ik denk dat RMI (of een webservice) op de lange termijn makkelijker en flexibeler is, maar dit is wel geschikt voor quick and dirty oplossingen

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Is dat een valide constructie in Java? Ik heb nog nooit gezien dat enum members methodes kunnen bevatten. En zijn de enum members dat automatisch een sub-class van het enum type?

Ik ben niet zo bekend met de nieuwe taal-constructies van java, maar ik vind het er een beetje apart uit zien.

edit:
Ik zie dat java enum's gewoon als static readonly members van een "normale" class ( en dus ook van dat type ) geimplementeerd zijn, dus dan maakt het wel aannemelijker dat het idd kan. Ik ben gewend dat een enum alleen een lijst met constanten is, en dus geen methodes kan bevatten ;)

[ Voor 33% gewijzigd door Woy op 02-07-2009 10:12 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jeroenikke
  • Registratie: Augustus 2003
  • Laatst online: 13:04
Ik denk dat het werkt, aangezien wij zoiets dit jaar op 't unief gezien hebben in de les ;-)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:15

Janoz

Moderator Devschuur®

!litemod

Wij hebben laatst nog een enum gebruikt voor het implementeren van een singleton. Die enum bestond alleen uit INSTANCE met de daarbij behorende methoden.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Creatief :). Ik wist ook niet dat dat kon met die methods op enum members. Wel cool. Gaat op de proton todo list :P

(Alleen raar dat je Enum.valueOf(Command, value) moet doen ipv Command.valueOf(value), wat me logischer lijkt)

[ Voor 115% gewijzigd door .oisyn op 02-07-2009 10:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 13:08
Janoz schreef op donderdag 02 juli 2009 @ 10:15:
Wij hebben laatst nog een enum gebruikt voor het implementeren van een singleton. Die enum bestond alleen uit INSTANCE met de daarbij behorende methoden.
Yep, die tip heb ik ook gelezen in de tweede editie van Effective Java van Josh Bloch.
Had er nog nooit bij stilgestaan, maar vond het wel een aardige invalshoek.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ja ik zag al dat enum's values in java eigenlijk gewoon instances van objecten zijn. In C# ( en C/C++ ) zijn het gewoon byte/short/int/long/etc.. values, en je kunt er dan dus ook geen methods aan toevoegen.

[ Voor 3% gewijzigd door Woy op 02-07-2009 10:25 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 11:40

NetForce1

(inspiratie == 0) -> true

.oisyn schreef op donderdag 02 juli 2009 @ 10:21:
Creatief :). Ik wist ook niet dat dat kon met die methods op enum members. Wel cool. Gaat op de proton todo list :P

(Alleen raar dat je Enum.valueOf(Command, value) moet doen ipv Command.valueOf(value), wat me logischer lijkt)
Dat kan ook, ze hebben allebei hun toepassing.
Het mooie van methodes in enums is dat je niet of veel minder met switch-case statements hoeft te werken, en je ook geen case kunt vergeten.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

LoL Nou ja dit voorbeeld zag er wel ok uit.

Kende die hele site nog niet Goed om te weten. Neem ik het daar niet meer zo serieus mocht ik er nog eens opkomen..

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Woy schreef op donderdag 02 juli 2009 @ 10:05:
Is dat een valide constructie in Java? Ik heb nog nooit gezien dat enum members methodes kunnen bevatten. En zijn de enum members dat automatisch een sub-class van het enum type?

Ik ben niet zo bekend met de nieuwe taal-constructies van java, maar ik vind het er een beetje apart uit zien.

edit:
Ik zie dat java enum's gewoon als static readonly members van een "normale" class ( en dus ook van dat type ) geimplementeerd zijn, dus dan maakt het wel aannemelijker dat het idd kan. Ik ben gewend dat een enum alleen een lijst met constanten is, en dus geen methodes kan bevatten ;)
Zo nieuw is enum nou ook weer niet, inmiddels alweer een jaar of 6 denk ik. Juist de uitgebreide mogelijkheden van de enum in Java maakt het een erg mooie taalconstructie: het is niet slechts een opsomming van waarden, maar je kan ook state en behaviour toekennen. Een enum (zoals ik toepaste) is een combinatie van een abstract class met daarin de diverse implementaties (als singletons).
Aangevuld met erop kunnen switchen, EnumSet en nog een aantal dingen die ik vast vergeten ben (ik ben eigenlijk tester en programmeren doe ik meer als ondersteuning voor het testen en als hobby) is het iets dat iedere Java programmeur in zijn toolkit moet hebben.
.oisyn schreef op donderdag 02 juli 2009 @ 10:21:
Creatief :). Ik wist ook niet dat dat kon met die methods op enum members. Wel cool. Gaat op de proton todo list :P

(Alleen raar dat je Enum.valueOf(Command, value) moet doen ipv Command.valueOf(value), wat me logischer lijkt)
Dat was de methode die ik in de API-documentatie van Enum zag staan, ik heb niet gekeken naar de verdere definitie van enum. Ik heb net even uitgeprobeerd en Command.valueOf(value) werkt ook gewoon. Waarschijnlijk is de Enum.valueOf(class, value) eerder bedoeld voor de iets meer dynamische use cases.

[ Voor 18% gewijzigd door Remus op 02-07-2009 12:01 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-09 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah, ok, mooi zo :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Remus schreef op donderdag 02 juli 2009 @ 11:54:
[...]
Zo nieuw is enum nou ook weer niet, inmiddels alweer een jaar of 6 denk ik.
offtopic:
Het is ook minstens zo lang geleden dat ik zelf een Java app geschreven heb ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

battler schreef op woensdag 01 juli 2009 @ 19:38:
Ik ben een client-server applicatie aan het maken. Het is de bedoeling dat de clients methodes kan aanroepen die in server staan. Dit zal verre van optimaal zijn maar voor een klein schaalig schoolproject als dit voldoende.

Nu verstuur ik met een outputstream gewoon de methode bv. getinfo(truus).
Dit komt ook gewoon aan bij servers als inputstream getinfo(truus).
Hoe zorg ik ervoor dat de server dit ziet als een methode (alles wat ik verzend is een methode)?
Zoals iemand al aangaf, wat je zoekt is RMI, erg makkelijk en werkt prima, voor zover Java prima werkt dan :) .

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Mammon
  • Registratie: December 2006
  • Laatst online: 24-08 20:45
.oisyn schreef op donderdag 02 juli 2009 @ 10:21:
(Alleen raar dat je Enum.valueOf(Command, value) moet doen ipv Command.valueOf(value), wat me logischer lijkt)
Gelukkig kan dat ook.

Java:
1
2
3
4
5
6
7
8
9
public class TestEnum{
    enum Height { Heigh, Mid, Low };
    
    public static void main(String... args)
    {
        Height h = Height.valueOf("Mid");
        System.out.println(h);
    }
}
Pagina: 1