Java-reflektion (med exempel)

I den här handledningen lär vi oss reflektion, en funktion i Java-programmering som gör det möjligt för oss att inspektera och modifiera klasser, metoder etc.

I Java tillåter reflektion oss att inspektera och manipulera klasser, gränssnitt, konstruktörer, metoder och fält vid körtid.

Det finns en klass i Java med namnet Classsom håller all information om objekt och klasser vid körning. Objektet i klass kan användas för att utföra reflektion.

Reflektion av Java-klasser

För att återspegla en Java-klass måste vi först skapa ett objekt av Class.

Och med hjälp av objektet kan vi kalla olika metoder för att få information om metoder, fält och konstruktörer som finns i en klass.

Det finns tre sätt att skapa objekt i klass:

1. Använda metoden forName ()

 class Dog (… ) // create object of Class // to reflect the Dog class Class a = Class.forName("Dog");

Här forName()tar metoden namnet på klassen för att återspeglas som dess argument.

2. Använda getClass () -metoden

 // create an object of Dog class Dog d1 = new Dog(); // create an object of Class // to reflect Dog Class b = d1.getClass();

Här använder vi objektet från hundklassen för att skapa ett objekt av klass.

3. Använda .class-tillägg

 // create an object of Class // to reflect the Dog class Class c = Dog.class;

Nu när vi vet hur vi kan skapa objekt av Class. Vi kan använda detta objekt för att få information om motsvarande klass vid körning.

Exempel: Java-klassreflektion

 import java.lang.Class; import java.lang.reflect.*; class Animal ( ) // put this class in different Dog.java file public class Dog extends Animal ( public void display() ( System.out.println("I am a dog."); ) ) // put this in Main.java file class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get name of the class String name = obj.getName(); System.out.println("Name: " + name); // get the access modifier of the class int modifier = obj.getModifiers(); // convert the access modifier to string String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the superclass of Dog Class superClass = obj.getSuperclass(); System.out.println("Superclass: " + superClass.getName()); ) catch (Exception e) ( e.printStackTrace(); ) ) )

Produktion

 Namn: Hundmodifierare: allmän Superklass: Djur

I exemplet ovan har vi skapat en superklass: Animal och en subclass: Dog. Här försöker vi inspektera klassen Hund.

Lägg märke till uttalandet,

 Class obj = d1.getClass();

Här skapar vi ett objektobjekt för klass med getClass()metoden. Med hjälp av objektet kallar vi olika metoder för klass.

  • obj.getName () - returnerar namnet på klassen
  • obj.getModifiers () - returnerar klassens åtkomstmodifierare
  • obj.getSuperclass () - returnerar klassens superklass

För att lära dig mer om det Class, besök Java Class (officiell Java-dokumentation).

Obs! Vi använder Modifierklassen för att konvertera modifieraren för heltalstillgång till en sträng.

Reflekterande fält, metoder och konstruktörer

Paketet java.lang.reflectinnehåller klasser som kan användas för att manipulera klassmedlemmar. Till exempel,

  • Metodklass - ger information om metoder i en klass
  • Fältklass - ger information om fält i en klass
  • Konstruktörsklass - ger information om konstruktörer i en klass

1. Reflektion av Java-metoder

Den Methodklass tillhandahåller olika metoder som kan användas för att få information om metoder finns närvarande i en klass. Till exempel,

 import java.lang.Class; import java.lang.reflect.*; class Dog ( // methods of the class public void display() ( System.out.println("I am a dog."); ) private void makeSound() ( System.out.println("Bark Bark"); ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // using object of Class to // get all the declared methods of Dog Method() methods = obj.getDeclaredMethods(); // create an object of the Method class for (Method m : methods) ( // get names of methods System.out.println("Method Name: " + m.getName()); // get the access modifier of methods int modifier = m.getModifiers(); System.out.println("Modifier: " + Modifier.toString(modifier)); // get the return types of method System.out.println("Return Types: " + m.getReturnType()); System.out.println(" "); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )

Produktion

 Metodnamn: display Modifierare: offentlig Returtyper: ogiltig Metodnamn: makeSound Modifier: privat Returtyper: ogiltig

I exemplet ovan försöker vi få information om de metoder som finns i hundklassen. Som tidigare nämnts har vi först skapat ett objekt för att Classanvända getClass()metoden.

Lägg märke till uttrycket,

 Method() methods = obj.getDeclaredMethod();

Här getDeclaredMethod()returnerar alla metoder som finns i klassen.

Vi har också skapat ett objekt m av Methodklassen. Här,

  • m.getName () - returnerar namnet på en metod
  • m.getModifiers () - returnerar åtkomstmodifieraren för metoder i heltalsform
  • m.getReturnType () - returnerar typ av returmetod

Den Methodklass tillhandahåller även olika andra förfaranden som kan användas för att inspektera metoder vid körning. Om du vill veta mer besöker du klassen Java Method (officiell Java-dokumentation).

2. Reflektion av Java-fält

Liksom metoder kan vi också inspektera och modifiera olika fält i en klass med hjälp av Fieldklassens metoder . Till exempel,

 import java.lang.Class; import java.lang.reflect.*; class Dog ( public String type; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access and set the type field Field field1 = obj.getField("type"); field1.set(d1, "labrador"); // get the value of the field type String typeValue = (String) field1.get(d1); System.out.println("Value: " + typeValue); // get the access modifier of the field type int mod = field1.getModifiers(); // convert the modifier to String form String modifier1 = Modifier.toString(mod); System.out.println("Modifier: " + modifier1); System.out.println(" "); ) catch (Exception e) ( e.printStackTrace(); ) ) )

Produktion

 Värde: labrador Modifierare: offentlig

I exemplet ovan har vi skapat en klass som heter Dog. Det inkluderar ett offentligt fält med namnet typ. Lägg märke till uttalandet,

 Field field1 = obj.getField("type");

Here, we are accessing the public field of the Dog class and assigning it to the object field1 of the Field class.

We then used various methods of the Field class:

  • field1.set() - sets the value of the field
  • field1.get() - returns the value of field
  • field1.getModifiers() - returns the value of the field in integer form

Similarly, we can also access and modify private fields as well. However, the reflection of private field is little bit different than the public field. For example,

 import java.lang.Class; import java.lang.reflect.*; class Dog ( private String color; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access the private field color Field field1 = obj.getDeclaredField("color"); // allow modification of the private field field1.setAccessible(true); // set the value of color field1.set(d1, "brown"); // get the value of field color String colorValue = (String) field1.get(d1); System.out.println("Value: " + colorValue); // get the access modifier of color int mod2 = field1.getModifiers(); // convert the access modifier to string String modifier2 = Modifier.toString(mod2); System.out.println("Modifier: " + modifier2); ) catch (Exception e) ( e.printStackTrace(); ) ) )

Output

 Value: brown Modifier: private

In the above example, we have created a class named Dog. The class contains a private field named color. Notice the statement.

 Field field1 = obj.getDeclaredField("color"); field1.setAccessible(true);

Here, we are accessing color and assigning it to the object field1 of the Field class. We then used field1 to modify the accessibility of color and allows us to make changes to it.

We then used field1 to perform various operations on the private field color.

To learn more about the different methods of Field, visit Java Field Class (official Java documentation).

3. Reflection of Java Constructor

We can also inspect different constructors of a class using various methods provided by the Constructor class. For example,

 import java.lang.Class; import java.lang.reflect.*; class Dog ( // public constructor without parameter public Dog() ( ) // private constructor with a single parameter private Dog(int age) ( ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get all constructors of Dog Constructor() constructors = obj.getDeclaredConstructors(); for (Constructor c : constructors) ( // get the name of constructors System.out.println("Constructor Name: " + c.getName()); // get the access modifier of constructors // convert it into string form int modifier = c.getModifiers(); String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the number of parameters in constructors System.out.println("Parameters: " + c.getParameterCount()); System.out.println(""); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )

Output

 Constructor Name: Dog Modifier: public Parameters: 0 Constructor Name: Dog Modifier: private Parameters: 1

In the above example, we have created a class named Dog. The class includes two constructors.

We are using reflection to find the information about the constructors of the class. Notice the statement,

 Constructor() constructors = obj.getDeclaredConstructor();

Här kommer vi åt alla konstruktörer som finns i Dog och tilldelar dem till en arraykonstruktör av Constructortypen.

Vi använde sedan objekt c för att få olika information om konstruktören.

  • c.getName () - returnerar konstruktörens namn
  • c.getModifiers () - returnerar konstruktörens åtkomstmodifierare i heltal
  • c.getParameterCount () - returnerar antalet parametrar som finns i varje konstruktör

ConstructorBesök Constructor-klassen om du vill lära dig mer om klasserna

Intressanta artiklar...