CLASSE UTILISANT LA REFLECTION

tULIPOs Messages postés 52 Date d'inscription vendredi 16 juillet 2004 Statut Membre Dernière intervention 18 juin 2008 - 5 oct. 2005 à 02:58
tULIPOs Messages postés 52 Date d'inscription vendredi 16 juillet 2004 Statut Membre Dernière intervention 18 juin 2008 - 17 oct. 2005 à 00:33
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33919-classe-utilisant-la-reflection

tULIPOs Messages postés 52 Date d'inscription vendredi 16 juillet 2004 Statut Membre Dernière intervention 18 juin 2008
17 oct. 2005 à 00:33
voila
tu as voler le code chez http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html
je le savais en plus alors mon mtit con arrete de de foutre du monde et change tes mentalités , ici l'honeteté est un code de conduite alors sit tu veux apprendre fais toi des amis et pas des ennemis , tu sais "ptit truc " la prgrammation s'apprends ptit a ptit et ecrivant de la source et non pas en volant des code et en prétendant que c le notre ,
la je sais que t un ammateur et chez sun les ammateurs on les traine en justice et on se moque plus ou moins tout le temps de leus ammaterisme alors ptit truc apprends java puis reponds moi , si tu veux je peux t'ider a apprendre a coder java sinon cherche toi un bon programmeur , il y en a ici et demande lui de t'aider ,
voila voila , bonne chance et stp ne met plus de source ici , c'est une catastrophe , le niveau doit rester bon .
bye
esylus Messages postés 3 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 11 octobre 2005
11 oct. 2005 à 01:27
Je suis surpris que ton emploi chez SUN ne t'ai jamais permis de visiter le lien
http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html
...à moins que ton poste ne soit trop éloigné d'un ordinateur...
...ou que ta charge de webmaster chez amateur.com ne te prenne tout ton temps...
C'est toi qui n'as rien à faire ici.

PS : si tu travailles réellement chez SUN...démissionnes.
tULIPOs Messages postés 52 Date d'inscription vendredi 16 juillet 2004 Statut Membre Dernière intervention 18 juin 2008
11 oct. 2005 à 00:12
ca c constructif
tULIPOs Messages postés 52 Date d'inscription vendredi 16 juillet 2004 Statut Membre Dernière intervention 18 juin 2008
11 oct. 2005 à 00:10
arrete tes conneries mon ptit ,
aucun jdk n'accepte les ... , tu te crois ou , ca se voit que t un ammateur ,
tu sais quoi ta place n'est pas la , vas sut le site ammateur.com , t'as ta place , et stp ne me reponds pas , ca risque de me tuer de rire .
Bye mon ptit;
c vraiment incroyable : ... comme parametres formel :
tu sais quoi je vais appeler les autres pour leurs dire cette connerie, c vraiment une honte , et Vector deprecied : oh lala ça c le comble , dis tu viens d'ou toi , tu fais quoi dans la vie , t vraiment ridicule ,
tu sais je Boss chez SUN Afrique alors des gas comme toi ...
ecoute je te dis simplement apprends java , et apprends la logique du programmeur et surtout soigne toi .
esylus Messages postés 3 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 11 octobre 2005
10 oct. 2005 à 01:06
Pour ton information les trois petit points signifient que le nombre de paramêtres est variable, ainsi tu peut appeler ma methode comme ceci : ReflectTools.newInstance(monConstructeur, parametre1, parametre2);
ou bien
ReflectTools.newInstance(monConstructeur, parametre1, parametre2, parametre3);
Comme je m'en doutais c'est un probleme de version du JDK, en effet cette syntaxe n'est apparue que depuis le JDK 1.5
Il faut savoir suivre les évolutions d'un langage (comme tu le dit si bien, c'est important quand on est programmeur) et puisque tu est dans les reproches, je te signale que SUN déconseille l'utilisation des Vector (maintenant considérés comme drepecated). De plus je t'avais signalé dans mon message precedent que le probleme pouvais venir de la version du jdk apparement tu ne fais pas plus attention à ce que l'on te dit qu'à ce que tu dit toi-même.
A l'avenir abstient toi de faire des commentaires inutiles et hors de propos en te renseignant avant de poster (ou en posant des questions si tu comprends pas). J'attends des commentaires JUSTIFIE et CONSTRUCTIF, pas des reproches reposants sur des affirmations erronées.
tULIPOs Messages postés 52 Date d'inscription vendredi 16 juillet 2004 Statut Membre Dernière intervention 18 juin 2008
9 oct. 2005 à 23:00
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Enumeration;

import javax.swing.JFrame;

/*
* Created on 2 oct. 2005
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/

public class InfoClassUtils
{

// retourne les classe parente de la class classe
public static Vector getClassesParentes(Class classe) {
Vector cp = new Vector();
Class sousClasse = classe;
Class superClasse;
cp.add(sousClasse.getName());
superClasse = sousClasse.getSuperclass();
while (superClasse != null) {
cp.add(0,superClasse.getName());
sousClasse = superClasse;
superClasse = sousClasse.getSuperclass();
}
return cp;
}
// retourne le modificateur de la class en question
public static Vector getModificateurs(Class classe)
{
Vector cp = new Vector();
int m = classe.getModifiers();
if (Modifier.isPublic(m))
cp.add("public");
if (Modifier.isAbstract(m))
cp.add("abstract");
if (Modifier.isFinal(m))
cp.add("final");
if(Modifier.isInterface(m))
cp.add("interface");

return cp;
}
// retourne les Interface implémenté par la class classe
public static Vector getInterfaces(Class classe) {
Vector cp = new Vector();
Class[] interfaces = classe.getInterfaces();
for (int i = 0; i < interfaces.length; i++) {
cp.add(interfaces[i].getName());
}
return cp;
}
// retourne tous les méthodes de la classe classe
public static Vector getDeclaredMethod(Class classe)
{
Vector cp = new Vector();
Method[] methodes = classe.getDeclaredMethods();
for (int i = 0; i < methodes.length; i++) {
StringBuffer methode = new StringBuffer();
methode.append(formatParametre(methodes[i].getReturnType().getName()));
methode.append(" ");
methode.append(methodes[i].getName());
methode.append(rechercheParametres(methodes[i].getParameterTypes()));
cp.add(methode.toString());
}
return cp;
}
// retourne les méthodes public de la classe classe
public static Vector getMethodesPubliques(Class classe) {
Vector cp = new Vector();
Method[] methodes = classe.getMethods();
for (int i = 0; i < methodes.length; i++) {
StringBuffer methode = new StringBuffer();
methode.append(formatParametre(methodes[i].getReturnType().getName()));
methode.append(" ");
methode.append(methodes[i].getName());
methode.append(rechercheParametres(methodes[i].getParameterTypes()));
cp.add(methode.toString());
}
return cp;
}
// retourne les méthode privé de la class classe
public static Vector getMethodesPrivates(Class classe)
{
Vector mpub = InfoClassUtils.getMethodesPubliques(classe);
Vector mdec = InfoClassUtils.getDeclaredMethod(classe);
Vector mpri = new Vector();
int i=0;
Enumeration e= mdec.elements();
Object obj=null;
while(e.hasMoreElements())
{
if(!mpub.contains( obj=e.nextElement())) mpri.addElement(obj);
}
return mpri;
}
// une methode pour formater le résultat : dans getMethodesPrivates(Class classe)
private static String formatParametre(String s) {

if (s.charAt(0) == '[') {
StringBuffer param = new StringBuffer("");
int dimension = 0;
while (s.charAt(dimension) == '[') dimension++;
switch(s.charAt(dimension)) {
case 'B' : param.append("byte");break;
case 'C' : param.append("char");break;
case 'D' : param.append("double");break;
case 'F' : param.append("float");break;
case 'I' : param.append("int");break;
case 'J' : param.append("long");break;
case 'S' : param.append("short");break;
case 'Z' : param.append("boolean");break;
case 'L' : param.append(s.substring(dimension+1,s.indexOf(";")));
}

for (int i =0; i < dimension; i++)
param.append("[]");
return param.toString();
}
else return s;
}
private static String rechercheParametres(Class[] classes) {
StringBuffer param = new StringBuffer("(");
for (int i = 0; i < classes.length; i ++) {
param.append(formatParametre(classes[i].getName()));
if (i < classes.length - 1)
param.append(", ");
}
param.append(")");
return param.toString();
}

// retourne les champs public
public static Vector getChampsPublics(Class classe) {
Vector cp = new Vector();
Field[] champs = classe.getFields();

for (int i = 0; i < champs.length; i++)
cp.add(champs[i].getType().getName()+" "+champs[i].getName());


return cp;
}
// retourne les champs déclaré
public static Vector getChampsDeclared(Class classe)
{
Vector cp = new Vector();
Field[] champs = classe.getDeclaredFields();

for (int i = 0; i < champs.length; i++)
cp.add(champs[i].getType().getName()+" "+champs[i].getName());


return cp;
}
// retourne les champs privé
public static Vector getChampsPrivates(Class classe)
{
Vector cpub = InfoClassUtils.getChampsPublics(classe);
Vector cdec = InfoClassUtils.getChampsDeclared(classe);
Vector cpri = new Vector();
int i=0;
Enumeration e= cdec.elements();
Object obj=null;
while(e.hasMoreElements())
{
if(!cpub.contains( obj=e.nextElement())) cpri.addElement(obj);
}
return cpri;
}
public static void main(String t[]) throws ClassNotFoundException
{
Class c=Class.forName("javax.swing.JFrame");

System.out.println(InfoClassUtils.getMethodesPrivates(c));
System.out.println(InfoClassUtils.getChampsPublics(c));
System.out.println(InfoClassUtils.getClassesParentes(c));
System.out.println(InfoClassUtils.getInterfaces(c));
}

}
tULIPOs Messages postés 52 Date d'inscription vendredi 16 juillet 2004 Statut Membre Dernière intervention 18 juin 2008
9 oct. 2005 à 22:55
/*
* ReflectTools.java
*
* Created on 20 septembre 2005, 19:02
*
*/



import java.lang.reflect.*;

/**
*
* @author D'Isanto Yann
*/

public class ReflectTools
{


/**
* Créé une nouvelle instance d'un objet dont un constructeur est passé en
* paramètre.
*
* @param pConstructor Constructeur.
* @param pParameters Paramètres à passer au constructeur.
* @return Nouvelle instance de l'objet dont le constructeur a été passé en
* paramètre.
*/
public static final Object newInstance(Constructor pConstructor,
Object ...pParameters)
throws IllegalAccessException,
InstantiationException,
InvocationTargetException,
ReflectToolsException
{
int parametersCount = pParameters.length;
if(parametersCount != pConstructor.getParameterTypes().length)
{
throw new ReflectToolsException("Constructeur inexistant");
}
// Comparaison des types des paramètres
for(int i = 0;i < parametersCount;i++)
{
String constructorParameterType = ReflectTools.primitifToWrapper(
pConstructor.getParameterTypes(
)[i].getName());
String parameterType = pParameters[i].getClass().getName();
if(!constructorParameterType.equals(parameterType))
{
throw new ReflectToolsException("Constructeur inexistant");
}
}
return pConstructor.newInstance(pParameters);
}


/**
* Créé une nouvelle instance d'une classe passée en paramètre.
*
* @param pClass Classe dont on veut une instance.
* @param pParameters Paramètres à passer au constructeur.
* @return Nouvelle instance de la classe passée en paramètre.
*/
public static final Object newInstance(Class pClass, Object pParameters)
throws InstantiationException,
IllegalAccessException,
InvocationTargetException,
ReflectToolsException
{
int parametersCount = pParameters.length;
Constructor []tConstructors = pClass.getConstructors();
Object rInstance = null;

// Parcours des constructeurs de la classe passée en paramètre
for(Constructor currentConstructor tConstructors)
{
int constructorParametersCount = currentConstructor.getParameterTypes(
).length;
if(constructorParametersCount != parametersCount)
{
continue;
}
boolean allTypesOK = true;
// Comparaison des types des paramètres
for(int i = 0;i < parametersCount;i++)
{
String constructorParameterType = ReflectTools.primitifToWrapper(
currentConstructor.getParameterTypes(
)[i].getName());
String parameterType = pParameters[i].getClass().getName();
if(!constructorParameterType.equals(parameterType))
{
allTypesOK = false;
break;
}
}
if(allTypesOK)
{
rInstance = currentConstructor.newInstance(pParameters);
}
}
if(rInstance == null)
{
throw new ReflectToolsException("Constructeur inexistant");
}
return rInstance;
}


/**
* Créé une nouvelle instance d'une classe dont le nom est
* passé en paramètre.
*
* @param pClass Nom de la classe dont on veut une instance.
* Attention, le nom de la classe doit être complet, packages compris
* exemple : java.lang.String.
* @param pParameters Paramètres à passer au constructeur.
* @return Nouvelle instance de la classe dont le nom est
* passé en paramètre.
*/
public static final Object newInstance(String pClass, Object ...pParameters)
throws InstantiationException,
IllegalAccessException,
InvocationTargetException,
ClassNotFoundException,
ReflectToolsException
{
return newInstance(Class.forName(pClass), pParameters);
}


/**
* Donne le nom du wrapper correspondant au primitif dont
* le nom est passé en paramètre.
*
* @param pPrimitif Nom du primitif (exemple : "int").
* @return Nom du wrapper correspondant au primitif dont
* le nom est passé en paramètre (exemple : "java.lang.Integer").
*/
public static final String primitifToWrapper(String pPrimitif)
{
String wrapper = pPrimitif;
if(pPrimitif.equals("void"))
{
wrapper = "java.lang.Void";
}
else if(pPrimitif.equals("boolean"))
{
wrapper = "java.lang.Boolean";
}
else if(pPrimitif.equals("char"))
{
wrapper = "java.lang.Character";
}
else if(pPrimitif.equals("byte"))
{
wrapper = "java.lang.Byte";
}
else if(pPrimitif.equals("short"))
{
wrapper = "java.lang.Short";
}
else if(pPrimitif.equals("int"))
{
wrapper = "java.lang.Integer";
}
else if(pPrimitif.equals("long"))
{
wrapper = "java.lang.Long";
}
else if(pPrimitif.equals("float"))
{
wrapper = "java.lang.Float";
}
else if(pPrimitif.equals("double"))
{
wrapper = "java.lang.Double";
}
return wrapper;
}


/**
* Permet de lire la valeur d'un attribut privé d'un objet.
* ATTENTION : l'accès aux attributs privés ne marche pas si la jvm
* est lancée avec le flag "-Djava.security.manager".
*
* @param pObjet Objet dont on veut lire la valeur d'un attribut.
* @param pField Nom de l'attribut dont on veut lire la valeur.
* @return Valeur de l'attribut.
*/
static public Object getPrivateField(Object pObject, String pField)
throws NoSuchFieldException, IllegalAccessException
{
Class objectClass = pObject.getClass();
Object value = new Object();
Field objectField = objectClass.getDeclaredField(pField);
objectField.setAccessible(true);
value = objectField.get(pObject);
return value;
}


/**
* Permet de fixer la valeur d'un attribut privé d'un objet.
* ATTENTION : l'accès aux attributs privés ne marche pas si la jvm
* est lancée avec le flag "-Djava.security.manager".
*
* @param pObjet Objet dont on veut fixer la valeur d'un attribut.
* @param pField Nom de l'attribut dont on veut fixer la valeur.
* @param pValeur Nouvelle valeur que l'on veut fixer à l'attribut.
* ATTENTION : l'objet pValeur doit bien sûr être du même type que l'attribut.
* @return L'objet modifié.
*/
static public Object setPrivateField(Object pObject, String pField,
Object pValue)
throws NoSuchFieldException, IllegalAccessException
{
Class objectClass = pObject.getClass();
Field objectField = objectClass.getDeclaredField(pField);
objectField.setAccessible(true);
objectField.set(pObject, pValue);
return pObject;
}
}
regarde moi ça : Object ...pParameters
public static final Object newInstance(Constructor pConstructor,
Object ...pParameters)

je ne savais pas qu'il y 'avait un Objet précédé par 3 points , tu sais il faut respecter le code source, c important quands on est programmeur!!!
pour t'aider voici une classe qui marche trés bien essaye de la compiler tu verras il n'ya aucun pb:
esylus Messages postés 3 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 11 octobre 2005
7 oct. 2005 à 10:03
Pourais-tu me dire l'erreur que tu as lors de la compilation, car chez moi ça compile parfaitement (j'ai oublié de préciser qu'il faut un jdk 1.5, ça vient peut-être de là).

Par contre je prends assez mal que tu me traite de voleur, il existe surement des codes semblables au mien (il est evident que je ne suis pas le premier à créer une classe utilisant la réflection), cependant je n'ai jamais copié et encore moins volé ce code.
tULIPOs Messages postés 52 Date d'inscription vendredi 16 juillet 2004 Statut Membre Dernière intervention 18 juin 2008
5 oct. 2005 à 02:58
ton coden est bien mais stp la prochaine fois met un code qui compile
et essaye de ne plus voler les codes des autres et les metre sous ton nom
la régle la plus basic de la programation est de coder un pgm qui roule
alors roule mon pote
Rejoignez-nous