Avatar billede mercutio Nybegynder
20. november 2007 - 10:04 Der er 12 kommentarer og
1 løsning

Program der loader alle klasser der extender bestemt klasse

Hej Eksperter.

Er det muligt at lave en unit test der loader alle klasser der extender en bestemt klasse og så kalder en abstract metode og tjekker det metoden returnerer?

Mvh. Merc.
Avatar billede mercutio Nybegynder
20. november 2007 - 10:06 #1
Bagefter skal jeg løbe alle variable igennem på klassen og tjekke om de er af en bestemt type. Hvis i lige ved hvordan det gøres vil jeg også meget gerne have et kode eksempel på det.
Avatar billede arne_v Ekspert
20. november 2007 - 15:38 #2
Nej.

Men svaret til det du ville spoerge om er ja.

Du kan godt finde alle klasser i en eller flere eksplicit angivne jar filer som extender en given klasse.
Avatar billede arne_v Ekspert
20. november 2007 - 15:40 #3
Du:
- lister entries i jar filen
- konverterer fra entry sti til classname
- loader klassen via en classloader med jar i path
- checker klassen via reflection

Jeg kan godt lave et eksempel senere.
Avatar billede mercutio Nybegynder
20. november 2007 - 15:52 #4
Er det et problem hvis klasserne ikke ligger i en jar fil?

Det er min domain model som jeg har i min src/main/java/domain/
Alle mine domain klasser nedarver fra en klasse DomainClass på domainclass er der en abstract metode copyObject() som returnerer en instans af klassen. Det er denne instans jeg vil tjekke.

Du må meget gerne lave et kode eksempel.
Avatar billede arne_v Ekspert
20. november 2007 - 15:59 #5
Et directory med class filer kan ogsaa gennemloebes.

Stay tuned.
Avatar billede mercutio Nybegynder
20. november 2007 - 16:09 #6
Super. Ser frem til eksemplet :-) Jeg kigger nok først på det senere i aften.
Avatar billede arne_v Ekspert
20. november 2007 - 16:13 #7
Jeg faar nok foerst tid til at lave eksemplet i aften.

Og klokken er 10:13 om formiddagen her !
Avatar billede mercutio Nybegynder
20. november 2007 - 16:23 #8
Ok. Det er super du vil hjælpe.
Avatar billede arne_v Ekspert
21. november 2007 - 04:00 #9
package november;

import java.io.File;

public class ClassLookup {
    public static void find(String basedir, String dirstr, Class<?> clz, ClassProcessor p) {
        File dir = new File(dirstr);
        String[] dirlist = dir.list();
        for (int i = 0; i < dirlist.length; i++) {
          String fnm = dir + System.getProperty("file.separator") + dirlist[i];
          if ((new File(fnm)).isDirectory()) {
              find(basedir, fnm, clz, p);
          } else {
              if(fnm.endsWith(".class")) {
                  String cn = fnm.substring(basedir.length() + 1).replace("\\", ".").replace(".class", "");
                  try {
                      Class<?> c = Class.forName(cn);
                      if(clz.isAssignableFrom(c)) {
                          p.process(fnm, cn);
                      }
                  } catch (ClassNotFoundException e) {
                  }
              }
          }
        }
       
    }
    public static void find(String dirstr, Class<?> clz, ClassProcessor p) {
        find(dirstr, dirstr, clz, p);
    }
    public static void main(String[] args) {
        ClassProcessor p = new ClassProcessor() {
            public void process(String fnm, String cn) {
                Object o = "no zero arg constructor";
                try {
                    o = Class.forName(cn).newInstance();
                } catch (InstantiationException e) {
                } catch (IllegalAccessException e) {
                } catch (ClassNotFoundException e) {
                }
                System.out.println("file=" + fnm + " class=" + cn + " default=" + o);
            }
        };
        find("C:\\IDEProjects\\Eclipse\\Eksperten\\bin", Object.class, p);
        find("C:\\IDEProjects\\Eclipse\\Eksperten\\bin", ClassLoader.class, p);
    }
}

interface ClassProcessor {
    public void process(String fnm, String cn);
}
Avatar billede arne_v Ekspert
21. november 2007 - 04:02 #10
Koden antager at dir faktisk er i classpath og den almindelige classloader kan bruges.

Der mangler gevaldigt noget error håndtering.

Jeg har ingen anelse om hvordan du vil bruge de fundne klasser, så jeg har bare
lavet en print metode.

Men du burde have noget at arbejde videre med.
Avatar billede mercutio Nybegynder
21. november 2007 - 08:21 #11
Jeg prøver lige om jeg ud fra det her kan få lavet en løsning. Der er den forskel at jeg kun kender en af klasserne og det er super klassen som de alle nedarver fra. Men jeg må kunne liste de klasser der er i den folder og så parent folderen til den osv.
Avatar billede mercutio Nybegynder
18. december 2007 - 10:02 #12
Jep så kører det tak for svaret =). Vil du lige oprette et svar så vi kan lukke denne.
Avatar billede arne_v Ekspert
18. december 2007 - 15:06 #13
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester