JAVA reflection understanding

First, the previous two files have already printed the results

package ref.lect;

import java.util.Date;

public class Exe1 {
    
    public void publicMethod(String str){
        System.out.println( "Called :: common method, parameter is :: " + str);
    }
    
    protected void protectedMethod(String str){
        System.out.println( "Called :: protected method with parameter :: " + str);
    }
    
    void xMethod(String str){
        System.out.println( "Called :: protected method with parameter :: " + str);
    }
    
    private int privateMethod(int num){
        System.out.println( "Called :: protected method with arguments :: " + num);
         return num;
    }
    
    private int id;
    public String name;
    protected Date birthday;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    
}
package ref.lect.invok;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

import ref.lect.Exe1;

public class Envok1 {
    public static void main(String[] args) {
        try {
            System.out.println( "================Get class object===============" );
            Class<?> exe1 = Class.forName("ref.lect.Exe1");
            System.out.println("类名 :: "+exe1.getName());
            
            System.out.println( "================Get method name===============" );
            Method[] ms = exe1.getMethods();
            for (int i = 0; i < ms.length; i++) {
                System.out.println("方法名"+i+":: "+ms[i]);
            }
            
            System.out.println( "================Get member name===============" );
            Field[] fs = exe1.getDeclaredFields();
            for (int i = 0; i < fs.length; i++) {
                System.out.println("成员名"+i+":: "+fs[i]);
            }
            
            System.out.println("================= 设置列   private protected public ===============");
            Object obj = Class.forName("ref.lect.Exe1").getConstructor().newInstance();
            Field fn = Class.forName("ref.lect.Exe1").getField("name"); // public
            fn.set(obj, "刘德华");
            Exe1 e1 = (Exe1)obj;
            System.out.println( "1:: Name value after set:: "+ e1.getName());
            System.out.println( "1:: The set birthday value:: "+ e1.getBirthday());
            System.out.println( "1:: id value after set:: "+ e1.getId());
            
            Field fb = Class.forName("ref.lect.Exe1").getDeclaredField("birthday");  // protected
            fb.setAccessible(true); // 暴力反射
            fb.set(obj, new Date());
            Exe1 e2 = (Exe1)obj;
            System.out.println( "2:: Name value after set:: "+ e2.getName());
            System.out.println( "2:: The set birthday value:: "+ e2.getBirthday());
            System.out.println( "2:: id value after being set:: "+ e2.getId());
            
            Field fi = Class.forName("ref.lect.Exe1").getDeclaredField("id");  // private
            fi.setAccessible(true); // 暴力反射
            fi.set(obj, 10086);
            Exe1 e3 = (Exe1) obj;
            System.out.println( "3:: Name value after set:: "+ e3.getName());
            System.out.println( "3:: The set birthday value:: "+ e3.getBirthday());
            System.out.println( "3:: id value after set:: "+ e3.getId());
            
            System.out.println("=======================调用method======================");
            Object mPublic = Class.forName("ref.lect.Exe1").getConstructor().newInstance();
            Method m1 = Class.forName("ref.lect.Exe1").getMethod("publicMethod",String.class);
            System.out.println(m1);
            Exe1 exe4 = (Exe1)mPublic;
            m1.invoke(exe4, "Zhang San" );
            
            Object mPrivate = Class.forName("ref.lect.Exe1").getConstructor().newInstance();
            Method m2 = Class.forName("ref.lect.Exe1").getDeclaredMethod("privateMethod",int.class);
            System.out.println(m2);
            m2.setAccessible(true);
            Exe1 exe5 = (Exe1)mPrivate;
            int num = (Integer) m2.invoke(exe5, 666);
            System.out.println( "Return result ==> num ==> :: " + num );
            
            
            
            
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace ();
        } catch (SecurityException e) {
            e.printStackTrace ();
        } catch (NoSuchMethodException e) {
            e.printStackTrace ();
        } catch (IllegalArgumentException e) {
            e.printStackTrace ();
        } catch (InstantiationException e) {
            e.printStackTrace ();
        } catch (IllegalAccessException e) {
            e.printStackTrace ();
        } catch (InvocationTargetException e) {
            e.printStackTrace ();
        }catch (NoSuchFieldException e) {
            e.printStackTrace ();
        }
    }
}
Execution result: 

=================Get class object================ classname::ref.lect.Exe1 ================Get method name============== Method name 0:: public java.lang.String ref.lect. Exe1.getName() method name 1:: public int ref.lect.Exe1.getId() method name 2:: public void ref.lect.Exe1.setName(java.lang.String) Method name 3:: public java.util.Date ref.lect.Exe1.getBirthday() Method name 4:: public void ref.lect.Exe1.publicMethod(java.lang.String) method name 5:: public void ref.lect.Exe1.setId( int ) Method name 6:: public void ref.lect.Exe1.setBirthday(java.util.Date) 方法名7:: public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException 方法名8:: public final void java.lang.Object.wait() throws java.lang.InterruptedException 方法名9:: public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException 方法名10:: public boolean java.lang.Object.equals(java.lang.Object) method name 11:: public java.lang.String java.lang.Object.toString() Method name 12:: public native int java.lang.Object.hashCode() 名 名 13 :: public final native java.lang.Class java.lang.Object.getClass () Method name 14 :: public final native void java.lang.Object.notify () Method name 15:: public final native void java.lang.Object.notifyAll() =================Get member name============ === MemberName0 :: private int ref.lect.Exe1.id membername1 :: public java.lang.String ref.lect.Exe1.name Member name 2:: protected java.util.Date ref.lect.Exe1.birthday ================= Set column private protected public ========== ===== 1 :: Name value after set:: Andy Lau 1:: Birthday value after set :: null 1:: id value after being set:: 0 2 :: Name value after being set:: Andy Lau 2:: Birthday value after being set:: Tue May 08 16:35:33 CST 2018 2:: id value after being set:: 0 3 :: Name value after being set:: Andy Lau 3:: Birthday value after being set:: Tue May 08 16:35:33 CST 2018 3:: id value after being set:: 10086 ======================== call method======================== public void ref.lect.Exe1.publicMethod(java.lang.String) The :: common method is called, the parameter is :: Zhang San private int ref.lect.Exe1.privateMethod(int) ::protected method called with arguments :: 666 return result ==> num ==> ::666

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325852439&siteId=291194637