One advantage of reflection API in Java is, it can manipulate private members of the class too. The java.lang.reflect package provides many classes to implement reflection java.Methods of the java.lang.Class class is used to gather the complete metadata of a particular class. In this tutorial, you will learn-
What is Reflection Class in java.lang.reflect Package Methods used in java.lang.Class How to get complete information about a class Example 1: How to get Metadata of Class Example 2: How to get Metadata of Variable Example 3: How to get Metadata of Method Example 4: How to get Metadata of Constructors
Class in java.lang.reflect Package
Following is a list of various Java classes in java.lang.package to implement reflection-
Field: This class is used to gather declarative information such as datatype, access modifier, name and value of a variable. Method: This class is used to gather declarative information such as access modifier, return type, name, parameter types and exception type of a method. Constructor: This class is used to gather declarative information such as access modifier, name and parameter types of a constructor. Modifier: This class is used to gather information about a particular access modifier.
Methods used in java.lang.Class
Public String getName (): Returns the name of the class. public Class getSuperclass(): Returns the super class reference Public Class[] getInterfaces() : Returns an array of interfaces implemented by the specified class
Public in getModifiers (): Returns an integer value representing the modifiers of the specified class which needs to be passed as a parameter to “public static String toString (int i )” method which returns the access specifier for the given class.
How to get complete information about a class
Following example shows different ways to create object of class “class” :
Example 1 : How to get Metadata of Class
Following example shows how to get metadata such as: Class name, super class name, implemented interfaces, and access modifiers of a class. We will get the metadata of below class named Guru99Base.class:
Name of the class is: Guru99Base It’s access modifiers are: public and abstract It has implemented interfaces: Serializable and Cloneable Since it has not extended any class explicitly, it’s super class is: java.lang.Object
Below class will get the meta data of Guru99Base.class and print it:
print the name of the class using getName method Print the name of the super class using getSuperClass().getName() method Print the name of the implemented interfaces Print the access modifiers used by the class
Example 2 : How to get Metadata of Variable
Following examples shows how to get metadata of variable: Here, we are creating a class named Guru99VariableMetaData .class with some variables:
Create the class object of the above class i.e. Guru99VariableMetaData.class as below: Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
Get the metadata in the form of field array using getFields() or getDeclaredFields() methods as below: Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields() method returns metadata of the public variable from the specified class as well as from its super class. getDeclaredFields() method returns metadata of the all the variables from the specified class only.
Get the name of the variables using “public String getName()” method. Get the datatype of the variables using “public Class getType()” method.
Get the value of the variable using “public xxx get (Field)” method. Here, xxx could be a byte or short of any type of value we want to fetch.
Get the access modifiers of the variables using getModifier() and Modifier.toString(int i) methods. Here, we are writing a class to get the metadata of the variables present in the class Guru99VariableMetaData .class:
package guru; import java.lang.reflect.Field;
public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableMetaData.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
// Get the metadata of all the fields of the class Guru99VariableMetaData
Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields();
// Print name, datatypes, access modifiers and values of the varibales of the specified class
for(Field field : guru99Field1) {
System.out.println("Variable name : "+field.getName());
System.out.println("Datatypes of the variable :"+field.getType());
int guru99AccessModifiers = field.getModifiers();
System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers));
System.out.println("Value of the variable : "+field.get(guru99ClassVar));
System.out.println();
system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;
}
}
}
Created class object for Guru99VariableMetaData.class Got all the metadata of the variables in a Field array Printed all the variable names in the class Guru99VariableMetaData.class Printed all the data types of the variables in the class Guru99VariableMetaData.class Printed all the access modifiers of the variables in the class Guru99VariableMetaData.class Printed values of all the variables in Printed all the data types of the variables in the class Guru99VariableMetaData.class
Example 3 : How to get Metadata of Method Following examples shows how to get metadata of a method: Here, we are creating a class named Guru99MethodMetaData .class with some methods
package guru; import java.sql.SQLException; public class Guru99MethodMetaData {
public void guru99Add(int firstElement, int secondElement , String result)
throws ClassNotFoundException, ClassCastException{
System.out.println("Demo method for Reflextion API");
}
public String guru99Search(String searchString)
throws ArithmeticException, InterruptedException{
System.out.println("Demo method for Reflection API");
return null;
}
public void guru99Delete(String deleteString)
throws SQLException{
System.out.println("Demo method for Reflection API");
}
} Steps to get the metadata about the methods in the above class :
Create the class object of the above class i.e. Guru99MethodMetaData.class as below: Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
Get method information in a Method array using getMethods() and getDeclaredMethods() method as below: Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s(); getMethods() method returns metadata of the public methods from the specified class as well as from its super class. getDeclaredMethods() method returns metadata of the all the methods from the specified class only. Get the name of the method using getName() method. Get the return type of the method using getReturnType() method. Get access modifiers of the methods using getModifiers() and Modifiers.toString(int i) methods. Get method parameter types using getParameterTypes() method which returns a class array.
Get thrown exception using getExceptionTypes() method which returns a class array.
Here, we are writing a class to get the metadata of the methods present in the class Guru99MethodMetaData.class:
package guru; import java.lang.reflect.Method; import java.lang.reflect.Modifier;
public class Guru99MethodMetaDataTest {
public static void main (String[] args) {
// Create Class object for Guru99Method MetaData.class
class guru99ClassObj = Guru99MethodMetaData.class;
// Get the metadata or information of all the methods of the class using getDeclaredMethods()
Method[] guru99Methods=guru99classObj.getDeclaredMethods();
for(Method method : guru99Methods) {
// Print the method names
System.out.println("Name of the method : "+method.getName());
// Print return type of the methods
System.out.println("Return type of the method : "+method.getReturnType());
//Get the access modifier list and print
int guru99ModifierList = method.getModifiers();
System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));
// Get and print parameters of the methods
Class[] guru99ParamList= method.getParameterTypes();
system.out.print ("Method parameter types : ");
for (Class class1 : guru99ParamList){
System.out.println(class1.getName()+" ");
}
System.out.println();
// Get and print exception thrown by the method
Class[] guru99ExceptionList = method. getExceptionTypes();
system.out.print("Excpetion thrown by method :");
for (Class class1 : guru99ExceptionList) {
System.out.println (class1.getName() +" "):
}
System.Out.println();
system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
}
}
}
Created class object for Guru99MethodMetaData.class Got all the metadata of all the methods in a Method array Printed all the method names present in the class Guru99MethodMetaData.class Printed return types of the methods in the class Guru99MethodMetaData.class Printed all the access modifiers of the methods in the class Guru99MethodMetaData.class Printed parameter types of the methods in Guru99MethodMetaData.class
Printed exceptions are thrown by methods in Guru99MethodMetaData.class
Example 4 : How to get Metadata of Constructors Following examples shows how to get metadata of constructors: Here, we are creating a class named Guru99Constructor.class with different constructors:
package guru;
import java.rmi.RemoteException; import java.sql.SQLException;
public class Guru99Constructor {
public Guru99Constructor(int no) throws ClassCastException ,ArithmeticException{ }
public Guru99Constructor(int no, String name) throws RemoteException ,SQLException{ }
public Guru99Constructor(int no, String name, String address) throws InterruptedException{ }
} Here, we are writing a class to get the metadata of the constructors present in the class Guru99Constructor.class:
package guru; import java.lang.reflect.Constructor; public class Guru99ConstructorMetaDataTest {
public static void main (String[] args) {
// Create Class object for Guru99Constructor.class
Class guru99Class=Guru99Constructor.class;
// Get all the constructor information in the Constructor array
Constructor[] guru99ConstructorList = guru99Class.getConstructors();
for (Constructor constructor : guru99ConstructorList) {
// Print all name of each constructor
System.out.println("Constrcutor name : "+constructor.getName());
//Get and print access modifiers of each constructor
int guru99Modifiers= constructor.getModifiers();
System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));
// Get and print parameter types
Class[] guru99ParamList=constructor.getParameterTypes();
System.out.print ("Constrctor parameter types :");
for (Class class1 : guru99ParamList) {
System.out.println(class1.getName() +" ");
}
System. out.println();
// Get and print exception thrown by constructors
Class[] guru99ExceptionList=constructor.getFxceptionTypes();
System.out.println("Exception thrown by constructors :");
for (Class class1 : guru99ExceptionList) {
System.out.println(class1.getName() +" ");
}
System.out.println();
System.out.println("*******************************************");
}
}
}
Created class object for Guru99Constructor.class Got all the metadata of all the constructors in a Constructor array Printed all the constructor’s names present in the class Guru99Constructor.class Printed all the access modifiers of the constructors in the class Guru99Constructor.class Printed parameter types of the constructors in Guru99Constructor.class Printed exceptions are thrown by constructors in Guru99Constructor.class
Summary:
Reflection programming in java helps in retrieving and modifying information about Classes and Class members such variable, methods, constructors. Reflection API in Java can be implemented using classes in java.lang.reflect package and methods of java.lang.Class class. Some commonly used methods of java.lang.Class class are getName (), getSuperclass (), getInterfaces (), getModifiers () etc. Some commonly used classes in java.lang.reflect package are Field, Method, Constructor, Modifier, etc. Reflection API can access private methods and variables of a class which could be a security threat. Reflection API is a powerful capability provided by Java, but it comes with some overheads such as slower performance, security vulnerability, and permission issue. Hence, reflection API should be treated as the last resort to performing an operation.
Example 3 : How to get Metadata of Method
Following examples shows how to get metadata of a method: Here, we are creating a class named Guru99MethodMetaData .class with some methods
Steps to get the metadata about the methods in the above class :
Create the class object of the above class i.e. Guru99MethodMetaData.class as below: Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
Get method information in a Method array using getMethods() and getDeclaredMethods() method as below: Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s(); getMethods() method returns metadata of the public methods from the specified class as well as from its super class. getDeclaredMethods() method returns metadata of the all the methods from the specified class only. Get the name of the method using getName() method. Get the return type of the method using getReturnType() method. Get access modifiers of the methods using getModifiers() and Modifiers.toString(int i) methods. Get method parameter types using getParameterTypes() method which returns a class array.
Get thrown exception using getExceptionTypes() method which returns a class array.
Here, we are writing a class to get the metadata of the methods present in the class Guru99MethodMetaData.class: getDeclaredMethods() method returns metadata of the all the methods from the specified class only.
Created class object for Guru99MethodMetaData.class Got all the metadata of all the methods in a Method array Printed all the method names present in the class Guru99MethodMetaData.class Printed return types of the methods in the class Guru99MethodMetaData.class Printed all the access modifiers of the methods in the class Guru99MethodMetaData.class Printed parameter types of the methods in Guru99MethodMetaData.class
Printed exceptions are thrown by methods in Guru99MethodMetaData.class
Example 4 : How to get Metadata of Constructors
Following examples shows how to get metadata of constructors: Here, we are creating a class named Guru99Constructor.class with different constructors:
Here, we are writing a class to get the metadata of the constructors present in the class Guru99Constructor.class:
Created class object for Guru99Constructor.class Got all the metadata of all the constructors in a Constructor array Printed all the constructor’s names present in the class Guru99Constructor.class Printed all the access modifiers of the constructors in the class Guru99Constructor.class Printed parameter types of the constructors in Guru99Constructor.class Printed exceptions are thrown by constructors in Guru99Constructor.class
Summary: