What is reflection?
Mainly refers to the ability of a program to access, detect and modify its own status or behavior.
What is Java reflection?
Java reflection means that in the running state of the Java program, for any class, all properties and methods of this class can be obtained; for a given object, all properties and methods can be called Any of its properties and methods. This method of dynamically obtaining the content of a class and dynamically calling objects is called reflection mechanism.
The Java reflection mechanism mainly provides the following functions:
* 1. Determine the class to which any object belongs at runtime.
* 2. Construct an object of any class at runtime.
* 3. Determine the member variables and methods of any class at runtime.
* 4. Call the method of any object at runtime.
Java’s reflection mechanism is mainly used to analyze class capabilities. We can obtain information about members and members of each type in a program or assembly at runtime. The general object types in the program are confirmed during compilation. Java's reflection mechanism can dynamically create objects and call their properties during runtime. Therefore, the core of reflection is to dynamically load classes or call methods to access properties during runtime. It does not need to know in advance who the running object is.
Reflection can be used to:
Construct an object of any class during runtime. Determine the class to which any object belongs/whether it is an instance of a certain class during runtime. Obtain the properties and methods of any class, including inherited public methods that call methods of any object during runtime.
Example:
a) Get method
The routine DumpMethods class demonstrates the basic role of the Reflection API. It reads the class name, and then prints the method information of this class.
import java.lang.reflect.Method; public class DumpMethods { public static void main(String[] args) throws Exception //在方法后加上这句,异常就消失了 { //获得字符串所标识的类的class对象 Class> classType = Class.forName("java.lang.String");//在此处传入字符串指定类名,所以参数获取可以是一个运行期的行为,可以用args[0] //返回class对象所对应的类或接口中,所声明的所有方法的数组(包括私有方法) Method[] methods = classType.getDeclaredMethods(); //遍历输出所有方法声明 for(Method method : methods) { System.out.println(method); } } }
b) Calling methods through reflection
import java.lang.reflect.Method; public class InvokeTester { public int add(int param1, int param2) { return param1 + param2; } public String echo(String message) { return "Hello: " + message; } public static void main(String[] args) throws Exception { // 以前的常规执行手段 InvokeTester tester = new InvokeTester(); System.out.println(tester.add(1, 2)); System.out.println(tester.echo("Tom")); System.out.println("---------------------------"); // 通过反射的方式 // 第一步,获取Class对象 // 前面用的方法是:Class.forName()方法获取 // 这里用第二种方法,类名.class Class> classType = InvokeTester.class; // 生成新的对象:用newInstance()方法 Object invokeTester = classType.newInstance(); System.out.println(invokeTester instanceof InvokeTester); // 输出true // 通过反射调用方法 // 首先需要获得与该方法对应的Method对象 Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class }); // 第一个参数是方法名,第二个参数是这个方法所需要的参数的Class对象的数组 // 调用目标方法 Object result = addMethod.invoke(invokeTester, new Object[] { 1, 2 }); System.out.println(result); // 此时result是Integer类型 //调用第二个方法 Method echoMethod = classType.getDeclaredMethod("echo", new Class[]{String.class}); Object result2 = echoMethod.invoke(invokeTester, new Object[]{"Tom"}); System.out.println(result2); } }
The above is the detailed content of What is reflection in java?. For more information, please follow other related articles on the PHP Chinese website!