Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java luokan hakeminen tyypillä

zeropointx [19.10.2014 13:29:19]

#

Koitan tässä vääntää ohjelmaa, joka hakee jar tiedoston classit, metodit ja muuttujat. Ongelma tällä hetkellä on palauttaa haetun jar tiedoston Classit tyypillä. Esimerkiksi sanotaan, että jar tiedostossa on luokka nimeltä Pekka. Haluaisin hakea luokan suoraan Pekka- tyyppisenä ajon aikana, mutta saan sen aina tyyppisenä Class.

Pahoittelen koodin ulkonäköä, olen tässä vaan koittanut nopeasti väsätä tämän toimimaan haluamallani tavalla.

//parametrinä tiedoston nimi ja haluttavan luokan nimi, tarkoituksena olisi palauttaa luokan tyyppi mikäli mahdollista
  public static  Class<?> loadClass(String fileName,String className2)
    {
        try {

            JarFile jarFile = new JarFile(fileName);
            Enumeration e = jarFile.entries();

            URL[] urls = { new URL("jar:file:" + fileName+"!/") };
            URLClassLoader cl = URLClassLoader.newInstance(urls);

            while (e.hasMoreElements()) {
                JarEntry je = (JarEntry) e.nextElement();
                if(je.isDirectory() || !je.getName().endsWith(".class") || je.getName().contains("$")){
                    continue;
                }
                // -6 because of .class
                String className = je.getName().substring(0,je.getName().length()-6);
                className = className.replace('/', '.');
                if (className.equals(className2))
                {
                Class<?> c = cl.loadClass(className);
                return c;
                }
            }
                  } catch (Exception ex) {
            Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

Metabolix [19.10.2014 13:47:34]

#

Ei luokan tyyppi ole ikinä Pekka. Luokan tyyppi on Class. Pekka voi olla luokka. (Vertaa: luvun tyyppi ei voi olla 1, vaan luvun tyyppi on vaikkapa Integer, ja 1 on eräs mahdollinen Integer.)

Voit luoda uuden Pekka-tyyppisen olion kutsumalla Class-olion metodia newInstance (tai, jos parametrit ovat tarpeen, voit hakea oikean muodostimen metodilla getContructor ja kutsua sitten sen metodia newInstance). Tästä huolimatta et tietenkään voi käyttää Pekka-tyyppiä koodissasi, koska sitä ei ole olemassa koodin käännösvaiheessa. Toisin sanoen luomasi olio täytyy tallentaa Object-muuttujaan tai muun kantaluokan mukaiseen muuttujaan.

Aiheesta löytyy lisätietoa virallisista Java-oppaista. Jos kärsivällisyys ei riitä opetteluun, katso edes tämä esimerkki.

Ylipäänsä kuulostaa epäilyttävältä, että on luokka nimeltä Pekka. Luokka edustaa yleensä asiaa, jota voi olla monta. Onko ohjelmassasi useita Pekkoja (new Pekka("Puupää"), new Pekka("Töpöhäntä"))? Mikä on se Pekka-olioille yhteinen syvällisempi konsepti, jonka takia Pekka on oma luokkansa?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta