Exception system java

Fermé
amani - 23 juin 2012 à 23:55
 amani - 27 juin 2012 à 01:25
Bonjour,

Mon code lit toutes les méthodes a partir des plusieurs java class dans fichier jar.
Mon interface affiche toutes les méthodes dans le fichier .jar et l'utilisateur peut choisir n'importe quel méthode parmi eux , le problème que j'ai rencontré est que ds le cas ou la méthode a un param de type enum mon interface doit afficher les élément de cet enum ds un combobox voilà le bout de code ou j'ai trouvé un problème:


final Class<?>[] type = Meth.getParameterTypes(); //Meth la méthode sélectionné par //l'utilsateur
final JComponent[] comp = new JComponent[j1]; // j1 Nbre des paramètres de la méthode sélectionnée
//
for(int i=0;i<j1;i++) //
{
if(if(Meth.getParameterTypes()[i].isEnum())
{
comp[i] = new JComboBox((Object[])type[i].getMethod("values").invoke(type[i]));
// cette ligne affiche une exception systeme
}
else
{
//
}

}


l'exception est:
Class modelwebtester0.ModelWebTester.View.View$ItemAction can not access a member of class modelwebtester0.ModelWebTester.Model.DefaultUser with modifiers "public static"


mais j'ai pas utilisé le public static ds la classe contenant la méthode en question:voilà la classe du fichier jar ou se trouve la méthode sélectionnée:
enum DefaultUser{
MsrX(""),
MsrY(""),
MsrZ("");

private final String linkName;

private DefaultUser(String linkName) {
this.linkName = linkName;
}

public String getLinkName() {
return linkName;
}

}
public class LoginPage

{

public StartPage login(DefaultUser username,String password)
{
return new StartPage();
}
}
A voir également:

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
24 juin 2012 à 00:59
Et bien ! Ça fait un moment que tu es sur ce projet, le moins que l'on puisse dire c'est que tu en es toujours plus ou moins au même point...

Déjà tu as une erreur ici : if(if(Meth.getParameterTypes()[i].isEnum())
Mais je vais mettre ça sur le coup du copier/coller dans le forum.

Les informations que tu donnes ne sont pas suffisantes pour identifier l'erreur.
J'ai fait un code de test, mais il ne plante pas, donc difficile de t'aider davantage...
Regarde quelles peuvent être les différences avec ton code (pour identifier les mots clés "public static" qui manquent par exemple)

import java.awt.GridLayout;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;

enum DefaultUser
{
    MsrX(""),
    MsrY(""),
    MsrZ("");
    
    private final String linkName;
    
    private DefaultUser(String linkName)
    {
        this.linkName = linkName;
    }
    
    public String getLinkName() 
    {
        return linkName;
    }
}

enum Saison {Printemps,Ete,Automne,Hiver};

public class Test
{
    public static void bidon(DefaultUser user, int n, Saison saison)
    {
    }
    
    public static void main(String...args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
    {
        // Début Test
        
        Method meth = Test.class.getDeclaredMethod("bidon", DefaultUser.class, int.class, Saison.class);
        
        // Code méthode
        
        Class<?>[] params = meth.getParameterTypes();
        int nbParams = params.length;
        
        final JComponent[] components = new JComponent[nbParams];
        
        for(int i=0; i<nbParams; i++)
        {
            if (meth.getParameterTypes()[i].isEnum())
            {
                Class<? extends Enum<?>> enumParam = (Class<? extends Enum<?>>) params[i];
                Method getValues = enumParam.getMethod("values");
                Object[] values = (Object[]) getValues.invoke(enumParam);                
                components[i] = new JComboBox<>(values);
            }
            else
            {
                components[i]=new JLabel(params[i].getName(),JLabel.CENTER); // TODO
            }
        }
        
        // Fin Test
        
        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(1,nbParams));
        for (JComponent comp : components)
            frame.add(comp);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
3
le if if est une faute de frape .
merci pr votre code je l'ai exporter en.jar et mon code fonctionne avec il affiche tt comme il faut donc le problème n'est pas donc le code d'affichage mais plutôt dans mon fichier.jar.
mon fichier.jar est un package est ce que cela change qql chose? ( un package contenant des class java)

voilà ma classe elle parait juste mais..?(cette classe est ds un package sous forme d'un fichier.jar)

enum DefaultUser{
MsrX(""),
MsrY(""),
MsrZ("");

private final String linkName;

private DefaultUser(String linkName) {
this.linkName = linkName;
}

public String getLinkName() {
return linkName;
}

}

@State(StateName = "LoginPage") // ma classe est annoté
public class LoginPage

{

@Action(ActionName = "login") // mes méthodes sont annotés
public static void login(
@paramAnnotation(Name="Username") // mes paramètres sont annotés
DefaultUser username,

@paramAnnotation(Name="Password")
String password
){

}

}

est ce que les annotations qui sont définit en dehors du fichier.jar sont la cause? j'ai les pris en considérations avec isAnnotationPresent (je ne considère que les paramètres annotés des méthodes annotés ds les classe annotés de fichier.jar)
0
en tt cas j'ai annoté ta classe puis je l'ai exporté et elle fonctionne sans problème donc j'arrive ^pas a comprendre la cause!!
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
24 juin 2012 à 02:05
Le fait que les annotations soient définies ailleurs n'est pas un problème en soit sous réserve qu'elles sont connues à la compilation et à l'exécution. Par contre il serait peut-être intéressant que la classe DefaultUser soit public et définie dans son propre fichier.

Remarque : il est important que tu apprennes à indenter correctement ton code !
Il ne s'agit pas forcément d'utiliser toujours les mêmes idiotismes, mais d'adapter le code pour qu'il soit lisible, surtout dans ton cas où les annotations alourdissent la lecture...

public enum DefaultUser
{
    MsrX(""),
    MsrY(""),
    MsrZ("");

    private final String linkName;

    private DefaultUser(String linkName)
    {
        this.linkName = linkName;
    }

    public String getLinkName()
    {
        return linkName;
    }
}

@State(StateName = "LoginPage")
public class LoginPage
{
    @Action(ActionName = "login")
    public static void login(
        @paramAnnotation(Name="Username") DefaultUser username,
        @paramAnnotation(Name="Password") String password)
    {
    }
}
0
je vais voir comment resoudre merci bcpppppp pr ton code une autre question svp:
pr ton code il saffiche des composant ds une ligne si j'ajoute un bouton suivant a la fin de la ligne comment faire pr que le click ajoute la même ligne des composant ds la ligne dessous de la même fenêtre?( comme si a chaque choix d'une méthode je peux passer a un autre choix.. j'ai échoué de coder le listener du bouton "ajouter")
0
Grand merci msr vous m'avez aidé bcp concernant la 1 question aussi que tes remarques sont très importantes je vais les prendre en considération merci :)
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
24 juin 2012 à 15:10
Le problème, c'est que tu ne peux pas mettre plusieurs fois le même composants dans un même affichage, lorsque tu appuies sur ton bouton, tu dois recréer de nouveaux composants, et donc par exemple, refaire ta méthode de filtrage.

Voici une manière de faire :

public class Test
{

public static void addMethod(final JFrame frame, final GridLayout layout, final Method method) throws Exception
{
    Class<?>[] params = method.getParameterTypes();
    int nbParams = params.length;
    
    final JComponent[] components = new JComponent[nbParams];
    
    for (int i=0; i<nbParams; i++)
    {
            if (params[i].isEnum())
            {
                Class<? extends Enum<?>> enumParam = (Class<? extends Enum<?>>) params[i];
                Method getValues = enumParam.getMethod("values");
                Object[] values = (Object[]) getValues.invoke(enumParam);                
                components[i] = new JComboBox<>(values);
            }
            else
            {
                components[i]=new JLabel(params[i].getName(),JLabel.CENTER); // TODO
            }
    }
    
    JButton button = new JButton("+");
    button.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent arg0)
        {
            try 
            {
                addMethod(frame,layout,method);
            } 
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    });    
    
    for (int i=0; i<nbParams; i++)
        frame.add(components[i]);

    for (int i=nbParams; i<layout.getColumns(); i++)
        frame.add(new JLabel());
        
    frame.add(button);
    
    frame.pack();
    layout.setRows(layout.getRows()+1);
}

public static void bidon(DefaultUser user) {}
public static void bidon(DefaultUser user, int n) {}
public static void bidon(DefaultUser user, int n, Saison saison) {}

public static final int MAX_COL = 4; // TODO

public static void main(String...args) throws Exception
{
    JFrame frame = new JFrame();
    GridLayout layout = new GridLayout(1,MAX_COL);
    frame.setLayout(layout);
    
    addMethod(frame,layout,Test.class.getDeclaredMethod("bidon", DefaultUser.class));
    addMethod(frame,layout,Test.class.getDeclaredMethod("bidon", DefaultUser.class, int.class));
    addMethod(frame,layout,Test.class.getDeclaredMethod("bidon", DefaultUser.class, int.class, Saison.class));
    
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
2
merci bcp ça m'a aidé :)

addMethod(frame,layout,AddingFrames.class.getDeclaredMethod("bidon", DefaultUser.class,int.class));

Ici svp pourquoi on écrit pour le type int :int.class et non pas int tout cours?
quelle est la déférence ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
25 juin 2012 à 14:30
getDeclaredMethod prend en argument en tableau d'objets Class.
Or int est un type de données, et c'est int.class l'objet de type Class associé.
C'est exactement comme pour DefaultUser dont on passe l'objet DefaultUser.class en argument.
0
MERCI pr votre réponse
0
L'idée est de remplir un combo des toutes les méthodes d'un fichier .jar et c'est fait
2. afficher les paramètres de la méthode sélectionnée et c'est fait aussi.
3. calculer la class target d'une méthode sélectionné ( la classe qui est la valeur de retour de la méthode sélectionné) et c'est fait. depuis la classe target je veux répéter le même processus en cliquant sur le bouton ajouter... j'ai bien compris votre code concernant l'ajout d'un ensemble des composant dans la ligne layer suivante en cliquant sur le bouton d'ajout mais j'ai trouvé des difficulté a l'intégrer au niveau de mon code. merci de me guider vers la réponse.



public class View extends JFrame implements ActionListener {
public JPanel container = new JPanel();
private JComboBox<Object> combo = new JComboBox<Object>();
private JLabel label = new JLabel(" Available Methods are:");
public int k;
public ArrayList<Class> list;
public List<Method> list2;
public int j1;
public Method index;
public String PackageName;
public RoundButton button2;

public View(){
this.setTitle("Welcome ");
this.setSize(1200, 150);
final String K= "C:\\Users\\acer\\Desktop\\eclipse\\test.jar"; // le path du fichier.jar
list=ImportClassesOfJar.FindClasses(K); //ici ma méthode qui retourne toutes las classes des le fichier jar
for(int k=0;k<list.size();k++)
{
list2=Busniss.getMethods(list.get(k)); // chercher toutes les méthodes ds les class trouvé ds le fichier.jar
for(int j=0;j<list2.size();j++) // remlipr un combo par les méthodes trouvés
{
Method m=list2.get(j);
combo.addItem(list2.get(j).getName());
}

list2.removeAll(list2);
}
this.setResizable(false);//set the actual frame size.
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
combo.addActionListener(new ItemAction());
button2 = new RoundButton("+");
ActionListener action = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//

}
};
button2.addActionListener(action);
combo.setPreferredSize(new Dimension(150, 25));
final JButton bouton= new JButton("Test");
bouton.addActionListener(this);
container.add(label);
container.add(combo);
this.setContentPane(container);
this.setVisible(true);
}

}

class ItemAction implements ActionListener{ // l'action sur le combo: on vas choisir une //méthode, aaficher ses paramétres, puis calculer la class target et enfin affchicher le meme //container audessous du premier avec les nouvelles méthodes de la class target.
public void actionPerformed(ActionEvent e) {
ch=(String) combo.getSelectedItem();
combo.setVisible(true);
label.setVisible(true);
container.removeAll(); // pour vider le container des pamarétres pour chaque choix d'une méthode
container.add(label);//have to return the label and the combo
container.add(combo); // ajouter le combo de choix des méthodes
for(int k=0;k<list.size();k++)
{
list2=Busniss.getMethods(list.get(k));
for(int j=0;j<list2.size();j++)
{

int m=list2.get(j).getName().lastIndexOf(".");
String MethName=list2.get(j).getName().substring(m+1);

if(MethName.compareTo(ch)==0) //chercher le nom de la méthode //sélectionné en type string
{
index=list2.get(j); // le nom de la méthode sélectionné
j1=Busniss.parametersNumber(index); // le nombre de ses paramètres
}
}
}
Class<?>[] params = index.getParameterTypes();
final int nbParams = params.length;
final Class<?>[] type = index.getParameterTypes();
final JComponent[] comp = new JComponent[nbParams];

if(nbParams !=0) // si la méthode a des paramètres on va afficher l'enum ds un combo et le param de type String dans un JTextField
{
for(int i=0;i<nbParams ;i++)
{
if(index.getParameterTypes()[i].isEnum())
{
try {

Class<? extends Enum<?>> enumParam = (Class<? extends Enum<?>>) params[i];
Method getValues = enumParam.getMethod("values");
Object[] values = (Object[]) getValues.invoke(enumParam);
comp[i] = new JComboBox<>(values);
}
else{
JTextField MonLabel=new JTextField();
comp[i]=MonLabel;
comp[i].setPreferredSize(new Dimension(150,20));
comp[i].setForeground(Color.red.brighter());
comp[i].setSize(50, 70);
comp[i].setForeground(Color.red);
comp[i].setSize(120,20);
container.add(MonLabel);
String text = ((JTextField) comp[i]).getText();

}



catch (Exception e1)
{e1.printStackTrace(); }


}
}

}
}

}
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
26 juin 2012 à 18:45
Deux fautes énormissimes !

La classe View implémente ActionListener mais tu n'as pas défini la méthode actionPerformed puisque tu l'as mis dans la classe ItemAction qui utilise les membres de View alors qu'elle ne lui est pas interne.
Il faudrait fusionner ces deux classes pour avoir l'actionPerformed directement dans View.

La deuxième erreur qui saute immédiatement aux yeux, c'est ton instruction "if try else catch".
Soit tu fais "try if else catch", soit tu fais "if try catch else", mais tu ne peux pas mélanger les mots-clés n'importe comment...

Après, il y a d'autres erreurs, variables non-déclarées (String ch par exemple), ou alors déclarées comme champs de la classe alors que d'autres variables de même noms sont utilisées (int k)
Ensuite, tout est en public, non final, etc... il y a de sérieux points à revoir !
0