Toon posts:

[JAVA] plugins schrijven voor eigen applicatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een database applicatie geschreven met een aantal specifieke zaken erin gehackt. zo worden er bijvoorbeeld plaatjes gegenereerd van een bepaalde soort data, maar alleen voor die data, dus ik zou die functionaliteit uit het programma willen halen en in een soort van plugin willen plaatsen.

Nou heb ik al wel wat gezocht, maar ik kan niet echt iets vinden wat concreet zou aangeven dat deze functionaliteit standaard in SE of EE zou zitten.

Nou heb ik al wel over een eigen implementatie na zitten denken en dan komen er zaken als Sockets, RMI en SOAP opborrelen bij me. Maar mocht je grote hoeveelheden data willen gaan versturen naar de plugin is dit misschien niet wenselijk (mocht ik hier een foute gedachten kronkel maken, verbeter mij dan a.u.b.).

Andere (Windows) applicaties gebruiken hier meestal DLL's voor (volgens mij) en dumpen dit in een subdir en de applicatie gaat dan lopen poken in die subdir. Niet echt een goede cross platform mogelijkheid dacht ik zo. (Werkt photoshop niet volgens deze methode?)

Het zou niet zo moeten zijn dat ik alle java-files nodig zou hebben als ik er een plugin bij zou hangen (eigenlijk gewoon dus de gehele applicatie wederom compileren dus)

Anyway, om op de vraag te komen:

Is hier al iets voor gestandardiseerd?
Zonee, eigen implementatie maken m.b.v. Sockets, RMI of SOAP?

Of weet iemand van een open source projectje wat zich hier al mee bezig houd?

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Ik weet niet helemaal of ik je snap, maar Java ondersteund dynamic class loading. Dus laden van nieuwe java classes zonder het hele programma opnieuw te moeten compileren. Bedoel je dit?

Ik zou dan beginnen bij de ClassLoader-class en de Reflection technologie. Volg deze [ link ]

Signature van nature


Verwijderd

Topicstarter
Sircuri schreef op 22 augustus 2002 @ 10:52:
Ik weet niet helemaal of ik je snap, maar Java ondersteund dynamic class loading. Dus laden van nieuwe java classes zonder het hele programma opnieuw te moeten compileren. Bedoel je dit?
Ik gok dat je winamp kent?

Daar kan je bepaalde visualisatie plugins voor downloaden en in 'installeren'
Dit is in principe ongeveer wat ik wil. Losse plugins maken die mijn database data kunnen visualiseren.

Alleen als ik daar andere java classes voor zou gebruiken, moet ik van tevoren weten wat de naam van de class is........(mhhhmm....voortaan eerst lezen dan pas gaan tikken)......

...lees....lees..... shows you how to instantiate classes, get or set field values, and invoke methods. With the reflection API, you can perform these tasks even if the names of the classes, fields, and methods are unknown until runtime

Je zou gelijk kunnen hebben....ik ga dit even doorlezen en kijken of ik er mee kan wat ik wil. Thx!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik denk dat je beter een interface op kan stellen waar een plugin zich aan moet houden zodat het systeem acties op hem kan uitvoeren (bv start()), en een interface voor de plugin zodat hij dingen op het systeem kan uitvoeren. Je kan dan runtime plugins inladen en omdat ze voldoen aan die interface kan je er ook iets mee. Ik zou dus niet met reflection gaan werken.

Verwijderd

Topicstarter
Stel, ik zou van te voren dan de naam van de class niet weten, is het dan voldoende om de naam van de class te vinden met:

Class c = Class.forName(strg);

en er dan vanuit te gaan dat de filename com.firm."strg".class is?


In principe, heb even door de reflection documentatie gelezen, moet Reflection ook alles kunnen wat ik wil.

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Met een URLClassLoader kan je een class laden vanaf een URL en er een instantie van maken (er wordt dan een constructor zonder parameters aangeroepen). Die instantie kan je dan casten naar jouw gewenste type.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Niet casten naar een gewenst type. Je kan gewoon het volgende zeggen:

Class p = Class.forName(...);

//instantie maken
Plugin plugin = ...;//Plugin is jouw Plugin interface
plugin.setEnvironment(this);
plugin.start();

Daarom moet je dus zorgen dat die plugin een bepaald type implementeerd en jouw systeem netzo.

Verwijderd

Idd, zoals ik hierboven al gelezen heb, maak een standaard interface die door alle plugins gebruikt worden.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public interface Plugin
{
    public void doeIets1();
    public void doeIets2();
}

public class MyPlugin implements Plugin
{
    public MyPlugin()
    {
        //constructor
    }
    public void doeIets1()
    {
        /////code
    }
    public void doeIets2()
    {
        //code
    }
}

public class MyPlugin2 implements Plugin
{
    public MyPlugin2()
    {
        //constructor
    }
    public void doeIets1()
    {
        /////andere code
    }
    public void doeIets2()
    {
        //andere code
    }
}

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verder moet de plugin ook beschikking krijgen over een omgeving (wat die dan ook is). Anders kan die plugin verder nog bitterweing :D

  • Onno
  • Registratie: Juni 1999
  • Niet online
Vaker. Ik heb er ook ooit eens een thread aan gewijd. :+

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Gevonden: [rml][ Java] classes un-/reloaden[/rml] Maar dat was niet pas ;) .

Dit is trouwens een lekker vaag topic wat ik tegenkwam:
[rml][ BC3] (java) Foutmeldingen (Kom er niet uit!)[/rml]
Zogenaamd door jou gestart, de vraag staat alleen in de tweede post ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Niet casten naar een gewenst type. Je kan gewoon het volgende zeggen:
Class p = Class.forName(...);
Plugin plugin = p .newInstance();

Dit zou het toch niet moeten doen? Op compile time heeft newInstance() als type een object en die implementeerd geen Plugin (Over het runtime type kan je helemaal niks zeggen, want dat is geheel afhankelijk van de parameter aan forName).
Dus zonder cast krijg je dit toch helemaal niet door de compiler heen, of zeg ik nu iets doms?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Uiteraard ja...

Stel even dat er geparameterizeerde typen zijn en stel dat dit een schetjes van de klasse Class is:
code:
1
2
3
4
5
6
class Class<C> {
    public C newInstance() {
    }

    ....
}


>:) . Zou wel stoer zijn :9~ .

Je verlegt het probleem dan in feite naar:
code:
1
Class p = Class.forName(...);


en daar zou een raw assignment voor gebruikt kunnen worden. Je krijgt dan dus:

code:
1
2
Class<Plugin> clazz = Class.forName( ... );
Plugin p = clazz.newInstance();

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

[edit]
loopt uit zijn nek te kletsen.

Verwijderd

Topicstarter
Hee, inderdaad......hier staat zo'n beetje alles wat men nodig heeft.

Ik wist alleen in den beginne niet dat ik met classes loaden en reloaden te maken had....

Spreuk van de dag dan maar: Als je het weet, dan is het simpel :)

edit:
MHHM, schijnt meer een tijdelijke oorzaak te hebben
Overigens staat er een link naar het unloaden op http://www.javaworld.com maar deze schijnt een beetje dood te zijn. Is deze site volledig uit de lucht of is het tijdelijk?
Pagina: 1