Class objects can get methods in the class, represented by the method object, invoke the method's invoke can execute corresponding methods; You can get the constructor, which is represented by the constructor object. Call the Newinstance method of the constructor object to execute the constructor of the class, and you can get the member variable, represented by the Field object, which can directly modify the access rights and values of the member variables of the class.
Creating objects
Objects are created in two ways through reflection
Using the Class object's newinstance (), this is the most common way to create objects based on profile information.
Gets the specified constructor object by using the class object, and then creates an object of the class from the newinstance of the constructor object.
Calling methods
The first thing to do is to get the class object in the JVM, to get the method of class by the GetMethod method of class object, return the object of method type, and finally execute the method of class by Invoke of method object.
The following example demonstrates reading data from a configuration file to create an object dynamically, and also initializes the object with configuration file information to execute the object's setter.
1 Packagejvmtest;2 3 ImportJava.io.FileInputStream;4 Importjava.io.IOException;5 ImportJava.lang.reflect.Method;6 ImportJava.util.HashMap;7 ImportJava.util.Map;8 Importjava.util.Properties;9 Ten Public classExtendedobjectpoolfactory { One Privatemap<string, object> Objectpool =NewHashmap<>(); A PrivateProperties config =NewProperties (); - Public voidInit (String fileName) { - Try { theFileInputStream FIS =NewFileInputStream (fileName); - config.load (FIS); -}Catch(IOException ex) { -System.out.println ("read" + fileName + "Exception"); + ex.printstacktrace (); - } + } A PrivateObject CreateObject (String Clazzname)throwsException { at class<?> clazz = Class.forName (clazzname); - //To create an object using the Clazz default constructor - return clazz.newinstance (); - } - //to create an object from a configuration file - Public voidInitpool ()throwsException { in for(String name:config.stringPropertyNames ()) { - if(!name.contains ("%")) { to Objectpool.put (Name, CreateObject (Config.getproperty (name))); + } - } the } * $ //performs the set method of the object corresponding to the configuration filePanax Notoginseng Public voidInitproperty ()throwsException { - for(String name:config.stringPropertyNames ()) { the if(Name.contains ("%")) { +string[] Objandpro = name.split ("%"); A //Get Object theObject target = GetObject (objandpro[0]); + //Construct Setter Method name -String mtdname = "Set" + objandpro[1].substring (0,1). toUpperCase () + objandpro[1].substring (1); $ class<?> targetclass = Target.getclass (); $ Method MTD = Targetclass.getmethod (Mtdname, string.class); - Mtd.invoke (Target, Config.getproperty (name)); - } the } - }Wuyi the PublicObject getObject (String name) { - returnobjectpool.get (name); Wu } - About Public Static voidMain (string[] args)throwsException { $Extendedobjectpoolfactory EPF =Newextendedobjectpoolfactory (); -Epf.init ("ExtObj.txt"); - Epf.initpool (); - Epf.initproperty (); ASystem.out.println (Epf.getobject ("a")); + } the}
The object is dynamically created on line 25th using the default constructor, after the 23rd line of the program gets the class object.
If you want to use the specified constructor, you need to get the constructor object first, and then create the object using the newinstance of the Cronstructor object, like so,
1 Constructor ctor = Clazz.getconstructor (String. Class); 2 return ctor.newinstance ("Here are parameter for specific constructor");
Line 45th Gets the class object, in line 46 gets the specified method (with a parameter) from the class object, represented by the method object, and the invoke of the method object in the last 47 rows can execute the specified method of the class.
The example above is tested using the following test file,
ExtObj.txt
1 a=javax.swing.JFrame2 b=javax.swing.JLabel3 a%title=test title
Input results,
Javax.swing.jframe[frame0,0,0,0x0,invalid,hidden,layout=java.awt.borderlayout,title=test Title,resizable,normal , defaultcloseoperation=hide_on_close,rootpane=javax.swing.jrootpane[,0,0,0x0,invalid,layout= Javax.swing.jrootpane$rootlayout,alignmentx=0.0,alignmenty=0.0,border=,flags=16777673,maximumsize=,minimumsize =,preferredsize=],rootpanecheckingenabled=true]
View CodeAccessing member variables
The specified member variable can be accessed through the GetField method of the class object, and calls to the Setaccessable method that inherit from Accessableobject can gain access to the private member variable.
The following methods can access member variables,
Get (Object obj), which gets the value of the member variable. If it is a base type, use the GetInt (object obj) directly, GetChar (object obj) in a way
Set (Object obj), which sets the value of the member variable. If it is a base type, use the same way as Setint (object, int val), SetChar (object obj, char c)
The following shows the access member variables,
1 Packagejvmtest;2 3 ImportJava.lang.reflect.Field;4 5 classPerson {6 PrivateString name;7 Private intAge ;8 PublicString toString () {9 return"Person[name:" +name+ ", Age:" +age+ "]";Ten } One } A Public classFieldtest { - Public Static voidMain (string[] args)throwsException { -Person p =NewPerson (); theclass<person> clazz = person.class; - //getdeclaredfiled member variables that can get all access rights -Field NameField = Clazz.getdeclaredfield ("name"); - //true to remove permission restrictions +Namefield.setaccessible (true); - Namefield.set (P, "Tom"); +Field Agefield = Clazz.getdeclaredfield ("Age"); AAgefield.setaccessible (true); at Agefield.setint (P, +); - System.out.println (p); - } -}
The above program line 20th uses set (), and 23 rows use Setint (), Output,
Person[name:tom, Age:18]
manipulating arrays
Java.lang.reflect also contains an array class that dynamically creates an array, sets the value of the element, and is more powerful, the main method being,
Newinstance (..), create an array, you can specify the array element type, the array dimension, the length of the array
Get (...), get the element indexed as index, for an array of base data types, by Getint (...), GetChar (...) ...
Set (...), sets the element indexed to index, for an array of base data types, by Setint (...), SetChar (...) ...
The following demonstrates usage,
1 Packagejvmtest;2 3 ImportJava.lang.reflect.Array;4 5 Public classArrayTest2 {6 Public Static voidMain (string[] args) {7 //Create a three-dimensional array8Object arr = array.newinstance (String.class, 3, 4, 10);9 //gets the element with index 2, which is a two-dimensional arrayTenObject arrobj = Array.get (arr, 2); One //assigns a value to an element with a two-dimensional array index of 2 A //the elements of a two-dimensional array are one-dimensional arrays, so assignments are also assigned values using arrays -Array.set (Arrobj, 2,NewString[] {"King of the Land Tiger", "Pagoda Town River Demon" }); - //gets a two-dimensional array that specifies the element of index (the result is a one-dimensional array) theObject Anarr = Array.get (Arrobj, 3); -Array.set (Anarr, 8, "pheasant bulkhead drill, where to mount Uranus"); - //To cast arr to a three-dimensional array -string[][][] Cast =(string[][][]) arr; + -System.out.println (cast[2][2][0]); +System.out.println (cast[2][2][1]); ASystem.out.println (cast[2][3][8]); at } -}
The output is as follows,
1 King cover the ground tiger 2 Pagoda Town River Demon 3 Pheasant in the hole, where to Mount Uranus
Java Basics JVM-—— use reflection to build and manipulate objects