Java Réflexion obtenir l'Instance à partir d'un Champ
est-il possible de l'Instance à partir d'un Champ?
Voici un exemple de code:
public class Apple {
//... a bunch of stuffs..
}
public class Person {
@MyAnnotation(value=123)
private Apple apple;
}
public class AppleList {
public add(Apple apple) {
//...
}
}
public class Main {
public static void main(String args[]) {
Person person = new Person();
Field field = person.getClass().getDeclaredField("apple");
//Do some random stuffs with the annotation ...
AppleList appleList = new AppleList();
//Now I want to add the "apple" instance into appleList, which I think
//that is inside of field.
appleList.add( .. . //how do I add it here? is it possible?
//I can't do .. .add( field );
//nor .add( (Apple) field );
}
}
J'ai besoin d'utiliser la Réflexion, parce que je sais que je l'utilise avec des annotations. C'est juste un "échantillon", la méthode AppleList.add(Apple apple)
est en fait appelé par l'obtention de la méthode de la classe, puis de l'appeler.
et ce faisant, comme: method.invoke( appleList, field );
causes: java.lang.IllegalArgumentException: argument type mismatch
*MODIFIER*
Cela peut être utile pour quelqu'un qui est à la recherche de la même chose.
si la Personne de la classe, ont eu 2 ou plus Apple variables:
public class Person {
private Apple appleOne;
private Apple appleTwo;
private Apple appleThree;
}
quand je reçois le Terrain, comme:
Person person = new Person();
//populate person
Field field = person.getClass().getDeclaredField("appleTwo");
//and now I'm getting the instance...
Apple apple = (Apple) field.get( person );
//this will actually get me the instance "appleTwo"
//because of the field itself...
au début, en regardant la ligne seul: (Apple) field.get( person );
m'a fait penser que ce serait aller et obtenir une Instance qui correspond à Apple de classe.
c'est pourquoi je me demandais: "qui d'Apple qu'il sera de retour?"
OriginalL'auteur sam | 2012-10-11
Vous devez vous connecter pour publier un commentaire.
Le champ n'est pas une pomme elle-même - c'est juste un champ. Comme c'est un instance de terrain, vous avez besoin d'une instance de la classe de déclaration avant que vous pouvez obtenir une valeur. Vous souhaitez:
... après le
apple
champ est peuplée pour les instances visées àperson
, bien sûr.Pas sûr de ce que vous essayez de faire, mais si vous essayez juste d'obtenir tous les champs de type Apple vous avez probablement utiliser la Classe.getDeclaredFields() pour obtenir tous les champs et ensuite en boucle par ceux pour voir ceux qui sont de type Apple.
Je vois, au début, je pensais que le fait de savoir comment obtenir une instance de l'un des champs serait assez, ne sont pas vraiment à ma question claire. Je suis en train de faire une classe qui "crée" un swing gui à partir d'une classe, donc il va obtenir tous les composants comme JButton, component swing jtextfield, etc. Donc je me demandais si cela fonctionnera comme ..: JComponent jcomponent = (JComponent).get(ClassExtendedFromJFrame); quelque chose comme cela.. (c'est un peu confus). Je vais continuer d'essayer, et de voir ce qu'il sera de retour, je vais essayer de la boucle de la solution, merci pour votre aide.
OriginalL'auteur Jon Skeet