I What is reflection
Reflection is a dynamic mechanism in java, which allows us to determine the instantiation of objects and the call of methods during the running of programs, Property operation, etc. The flexibility of the program is greatly improved, but it also brings more resource overhead and lower cost Operation efficiency. Programs cannot rely too much on reflection mechanisms.
2. Reflection acquisition method
Class object Each instance of Class is used to represent a Class loaded in the JVM, and each Class loaded by the JVM is There is only one instance of Class. Through Class, we can know all the information of the Class it represents: Class name, package name, constructors and methods Properties, etc. And perform relevant operations after obtaining during operation. Therefore, the first step of reflection operation is to obtain the class object of the class to be operated. The methods to obtain the class object of a class are: 1: Class name class For example: Class cls = String.class; Class cls = int.class; Note: basic types can only obtain class objects in the above way
2: Class.forName(String className) Use the static method forName of class to pass in the fully qualified name (package name. Class name) of the class to be loaded For example: Class cls = Class.forName("java.lang.String")
3: ClassLoader form
3. Common methods
Class cls = Class.forName("reflect.Person"); //Get the relevant information of the String represented by the class object String name = cls.getName(); //Get package name and class name name = cls.getSimpleName(); //Get class name System.out.println(cls.getPackage().getName()); //Get package name //The class object provides a method newInstance() that can call the parameterized and exposed constructor instantiation Object o = cls.newInstance(); 2 Get the corresponding constructor Person(String name,int age) // cls.getConstructor();// A parameter free constructor is obtained without passing parameters //3 instantiate the object new Person("Wang Wu", 22) through the constructor; Object o = cls.newInstance("Wang Wu",22); //Gets all exposed methods of the class represented by the current class object (including methods inherited from the superclass) Method[] methods = cls.getMethods(); //Get private method Method method = cls.getDeclaredMethod("secret"); //Force open access method.setAccessible(true);
Invoke method using reflection mechanism: invoke
1. Call parameterless method
public class ReflectDemo4 { public static void main(String[] args) throws Exception { Person p = new Person(); p.sayHello(); Scanner scanner = new Scanner(System.in); System.out.println("Please enter the class name:"); String className = scanner.nextLine(); System.out.println("Please enter method name:"); String methodName = scanner.nextLine(); //instantiation // Class cls = Class.forName("reflect.Person"); Class cls = Class.forName(className); Object o = cls.newInstance();//Person o = new Person(); //Gets the method to call //When only the method name is passed in, the parameterless method is obtained // Method method = cls.getMethod("sayHello");// Represents the member method sayHello() of the Person Method method = cls.getMethod(methodName); method.invoke(o);//o.sayHello() } }
2. Call the method with parameters
public class ReflectDemo5 { public static void main(String[] args) throws Exception { Class cls = Class.forName("reflect.Person"); Object o = cls.newInstance(); Method method = cls.getMethod("dosome",String.class);//dosome(String) method.invoke(o,"play a game");//p.dosome("play a game"); Method method1 = cls.getMethod("dosome",String.class,int.class); method1.invoke(o,"Watch tv",5); } }
4. Annotations used in reflection
Define @ AutoRunClass annotation
This annotation is used to label classes that can be automatically called by the reflection mechanism
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface AutoRunClass { }
When defining annotations, we usually use two built-in annotations in java to modify them 1.@Retention is used to specify the retention level of the current annotation. There are three optional values, corresponding: RetentionPolicy.SOURCE indicates that the current annotation is only kept in the source code RetentionPolicy. Class (default) means that annotations will remain in bytecode, but the reflection mechanism is not available RetentionPolicy. The runtime representation remains in the bytecode file, but can be used by the reflection mechanism Usually, the annotations we define will be specified as RUNTIME level to assist the operation of reflection mechanism.
2.@Target is used to indicate where the current annotation can be used. All options are defined on ElementType Common are: ElementType.TYPE is used on a class ElementType.FIELD is used in attributes ElementType.METHOD is used in the method ...
Judge whether it is annotated: isannotationpresent (annotation name. class)
public class ReflectDemo7 { public static void main(String[] args) throws Exception { //Judge whether a class is marked by @ AutoRunClass // Class cls = Class.forName("reflect.Person"); // Class cls = Class.forName("reflect.Student"); Class cls = Class.forName("reflect.Test2"); /* In addition to Class, other reflection objects such as Method and file also support isAnnotationPresent Method to indicate whether the annotation is specified. For example: Method This method is to judge whether the method it represents is annotated. Constructor This method is to determine whether the constructor it represents is annotated. */ if(cls.isAnnotationPresent(AutoRunClass.class)){ System.out.println(cls.getName()+":cover@AutoRunClass Marked!"); }else{ System.out.println(cls.getName()+":Not by@AutoRunClass Marked!"); } } }