IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Chargeur de Class personnalisé


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut Chargeur de Class personnalisé
    Bonjour,

    Je cherche à utiliser un chargeur de class personnel.
    J'ai trouvé de la doc mais j'ai quelques petits problèmes.

    En effet, à l'execusion l'erreur ClassNotFoundException sort au niveau de la methode defineClass. Cette methode est sensée transformer un buffer Bytes en Objet Class pour le présenter à la machine virtuelle.

    Bon je mets un peu de code (j'espère que se sera plus claire...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    class ClassLoaderFrame extends JFrame
        {
            //partie affichage
            public ClassLoaderFrame()
            {
                setTitle("ClassLoaderTest");
                setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
                setLayout(new GridLayout(3,2));
                add(new JLabel("class"));
                add(nameField);
                add(new JLabel("Clé"));
                add(keyField);
                JButton loadButton = new JButton("Charger");
                add(loadButton);
                loadButton.addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent e)
                    {
                        runClass(nameField.getText(), keyField.getText());
                    }
                });
                pack();
            }
     
     
            public void runClass(String name, String key)
            {
                try{
                    ClassLoader loader = new CryptoClassLoader(Integer.parseInt(key));
                    System.out.println("runClass1");
                    Class c = loader.loadClass(name);
                    System.out.println("runClass2");
                    String[] args = new String[] {};
                    Method m = c.getMethod("main", args.getClass());
                    System.out.println("runClass3");
                    m.invoke(null, (Object) args);
                    System.out.println("runClass4");
                }
                catch(Throwable e)
                {
                    JOptionPane.showMessageDialog(this,e);
                }
            }
     
            private JTextField keyField = new JTextField("3", 4);
            private JTextField nameField = new JTextField(30);
            private static final int DEFAULT_WIDTH = 300;
            private static final int DEFAULT_HEIGHT = 200;
        }
     
        class CryptoClassLoader extends ClassLoader
        {
            public CryptoClassLoader(int k)
            {key = k;}
     
            protected Class findClass(String name) throws ClassNotFoundException
            {
                byte[] classBytes = null;
                try{
                    classBytes = loadClassBytes(name);
                    System.out.println("classBytes = "+classBytes);
                }
                catch(IOException e)
                {
                    System.out.println("findClass1");
                    throw new ClassNotFoundException(name+"  findClass1");
                    //System.out.println("findClass1");
                }
                System.out.println("findClass11");
                Class cl = defineClass(name, classBytes, 0, classBytes.length);
                System.out.println("findClass12");
                if(cl == null)
                {
                    System.out.println("findClass2");
                    throw new ClassNotFoundException(name+"  findClass2");
                }
                System.out.println("findClass3");
                return cl;
            }
     
            private byte[] loadClassBytes(String name) throws IOException
            {
                System.out.println(name);
                String cname = name.replace('.', '/')+".eee";
                System.out.println(cname);
                FileInputStream in = null;
                in = new FileInputStream(new File(cname));
                System.out.println("in = "+in);
                try{
                    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                    int ch;
                    System.out.println("in1");
                    while((ch = in.read()) !=-1)//out1
                    {
                        byte b = (byte) (ch);
                        buffer.write(b);
                    }
                    System.out.println("in2");
                    in.close();
                    System.out.println("in2");
                    return buffer.toByteArray();
                }
                finally
                {
                    in.close();
                    System.out.println("in3");
                }
            }
            private int key;
        }
    Ma console donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    runClass1
    C:\\Documents and Settings\\DELL2\\Bureau\\Lanceur
    C:\\Documents and Settings\\DELL2\\Bureau\\Lanceur.eee
    in = java.io.FileInputStream@b09e89
    in1
    in2
    in2
    in3
    classBytes = [B@1787038
    findClass11
    java.lang.NoClassDefFoundError : C:\\Documents and Settings\\DELL2\\Bureau\\radar\\Lanceur (wrong name : Lanceur)
    Donc j'en conclu qu'il y a un problème au niveau de classDefine

    Rq1: si je laisse le monfichier.class sur l'ordi alors le chargeur le charge et n'utilise pas findClass (ce qui est normale)
    Rq2: le code a été en grande partie pompé. Je ne l'ai pas cré de bout en bout.

    Merci d'avance en espérant avoir été clair.

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Bonjour,

    J'ai trouvé (du moins je pense) Il faut que le name dans defineClass soit juste celui de la class et non sont url....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Chargeur de classes
    Par tounou666 dans le forum Général Java
    Réponses: 0
    Dernier message: 26/03/2010, 16h40
  2. stub et chargeur de classe
    Par couse1 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/05/2008, 15h30
  3. Chargeur de classe J2ME
    Par beepmaster dans le forum Java ME
    Réponses: 1
    Dernier message: 16/02/2008, 18h44
  4. chargeur de classe
    Par david06600 dans le forum Langage
    Réponses: 11
    Dernier message: 18/01/2008, 14h35
  5. Réponses: 2
    Dernier message: 02/08/2006, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo