JAVA反射了解

被反射类文件:

package ref.lect;

import java.util.Date;

public class Exe1 {
    
    public void publicMethod(String str){
        System.out.println("调用了::共有的方法,参数为:: " + str);
    }
    
    protected void protectedMethod(String str){
        System.out.println("调用了::受保护的方法,参数为:: " + str);
    }
    
    void xMethod(String str){
        System.out.println("调用了::受保护的方法,参数为:: " + str);
    }
    
    private int privateMethod(int num){
        System.out.println("调用了::受保护的方法,参数为:: " + 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;
    }
    
    public static void main(String[] args) {
        System.out.println("执行main方法了...");
    }
}

使用反射类文件:

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("=================获取类对象===============");
            Class<?> exe1 = Class.forName("ref.lect.Exe1");
            System.out.println("类名 :: "+exe1.getName());
            
            System.out.println("=================获取方法名===============");
            Method[] ms = exe1.getMethods();
            for (int i = 0; i < ms.length; i++) {
                System.out.println("方法名"+i+":: "+ms[i]);
            }
            
            System.out.println("=================获取成员名===============");
            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:: 被set后的name值:: "+ e1.getName());
            System.out.println("1:: 被set后的birthday值:: "+ e1.getBirthday());
            System.out.println("1:: 被set后的id值:: "+ 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:: 被set后的name值:: "+ e2.getName());
            System.out.println("2:: 被set后的birthday值:: "+ e2.getBirthday());
            System.out.println("2:: 被set后的id值:: "+ 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:: 被set后的name值:: "+ e3.getName());
            System.out.println("3:: 被set后的birthday值:: "+ e3.getBirthday());
            System.out.println("3:: 被set后的id值:: "+ 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, "张三");
            
            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("返回结果 ==> num ==> :: " + num );
            
            System.out.println("========================执行main方法================================");
            Object mMain = Class.forName("ref.lect.Exe1").getConstructor().newInstance();
            Method m3 = Class.forName("ref.lect.Exe1").getMethod("main",String[].class);
            m3.invoke(mMain, (Object)new String[]{"a","b","c"});
            
        } 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();
        }
    }
}

执行结果:

=================获取类对象===============
类名 :: ref.lect.Exe1
=================获取方法名===============
方法名0:: public static void ref.lect.Exe1.main(java.lang.String[])
方法名1:: public java.lang.String ref.lect.Exe1.getName()
方法名2:: public int ref.lect.Exe1.getId()
方法名3:: public void ref.lect.Exe1.setName(java.lang.String)
方法名4:: public java.util.Date ref.lect.Exe1.getBirthday()
方法名5:: public void ref.lect.Exe1.publicMethod(java.lang.String)
方法名6:: public void ref.lect.Exe1.setId(int)
方法名7:: public void ref.lect.Exe1.setBirthday(java.util.Date)
方法名8:: public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
方法名9:: public final void java.lang.Object.wait() throws java.lang.InterruptedException
方法名10:: public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
方法名11:: public boolean java.lang.Object.equals(java.lang.Object)
方法名12:: public java.lang.String java.lang.Object.toString()
方法名13:: public native int java.lang.Object.hashCode()
方法名14:: public final native java.lang.Class java.lang.Object.getClass()
方法名15:: public final native void java.lang.Object.notify()
方法名16:: public final native void java.lang.Object.notifyAll()
=================获取成员名===============
成员名0:: private int ref.lect.Exe1.id
成员名1:: public java.lang.String ref.lect.Exe1.name
成员名2:: protected java.util.Date ref.lect.Exe1.birthday
================= 设置列   private protected public ===============
1:: 被set后的name值:: 刘德华
1:: 被set后的birthday值:: null
1:: 被set后的id值:: 0
2:: 被set后的name值:: 刘德华
2:: 被set后的birthday值:: Tue May 08 16:55:27 CST 2018
2:: 被set后的id值:: 0
3:: 被set后的name值:: 刘德华
3:: 被set后的birthday值:: Tue May 08 16:55:27 CST 2018
3:: 被set后的id值:: 10086
=======================调用method======================
public void ref.lect.Exe1.publicMethod(java.lang.String)
调用了::共有的方法,参数为:: 张三
private int ref.lect.Exe1.privateMethod(int)
调用了::受保护的方法,参数为:: 666
返回结果 ==> num ==> :: 666
========================执行main方法================================
执行main方法了...

 

posted @ 2018-05-08 16:38  沈博先生之逍遥游  阅读(169)  评论(0编辑  收藏  举报