java的反射機制使用方法


 什么是反射?

  Java反射說的是在運行狀態中,對於任何一個類,我們都能夠知道這個類有哪些方法和屬性。對於任何一個對象,我們都能夠對它的方法和屬性進行調用。我們把這種動態獲取對象信息和調用對象方法的功能稱之為反射機制。

  反射的三種方式:

方式一:利用對象獲取類--------------不推薦(已經獲取到對象,再用反射意義不大)

public static void main(String[] args) {
        Person person = new Person();
        Class<?> c =   person.getClass();
        System.out.println(c.getName());
    }

方式二:利用類名獲取類--------------不推薦(需要對象的包,依賴性太強)

public static void main(String[] args) {
        Class<?> c =   Person.class;
        System.out.println(c.getName());
    }

方式三:利用類的全路徑名獲取-------------------推薦

本文主要就是講述方式三,通過類的全路徑名去獲取並操作類中的方法,字段等:

實體類代碼如下:

    ----本文中主要就是通過反射獲取並操作這個實體類中的字段和方法

package com.xnrd.common.base;

public class Person {
    public String height;
    
    public Double weight;
    
    private int  age;
    
    
    
    public Person() {
        super();
    }

    public Person(int age) {
        super();
        this.age = age;
    }

    
    public Person(Double weight, int age) {
        super();
        this.weight = weight;
        this.age = age;
    }


        
    private Person(String height, int age) {
        super();
        this.height = height;
        this.weight = weight;
        this.age = age;
    }


    public Person(String height, Double weight, int age) {
        super();
        this.height = height;
        this.weight = weight;
        this.age = age;
    }

    public String getHeight() {
        return height;
    }

    public void setHeight(String height) {
        this.height = height;
    }


    public Double getWeight() {
        return weight;
    }

    public void setWeight(Double weight) {
        this.weight = weight;
    }


    public int getAge() {
        return age;
    }




    public void setAge(int age) {
        this.age = age;
    }

    //自定義幾個方法
    public void methodOne(String str) {
        System.out.println("您吃飯了嗎?");
    }
    
    private void methodTwo() {
        System.out.println("我吃了?");
    }

    String methodThree(String height, Double weight,int age) {
        System.out.println("我是第三個方法!");
        return height+ weight+ age;
    }
    
    protected void methodFour() {
        System.out.println("我是第四個方法!");
    }
    
    public static void main(String[] args) {
        System.out.println("Person的main方法執行成功!");
    }
}
View Code

一、反射獲取構造方法 

  public static void getConstructors() {
        try {
            Class<?> class1 = Class.forName("com.xnrd.common.base.Person");
            //獲取類名
            System.out.println(class1.getName());
            System.out.println("------------------所有公用的構造方法---------------------------------");
            
            //獲取所有公用的構造方法
            Constructor<?>[] constructors = class1.getConstructors();
            for(Constructor<?> c : constructors) { 
                System.out.println(c);
            }
            System.out.println("-------------------所有的構造方法(包括私有的)--------------------------------");
            //獲取所有的構造方法(包括私有的)
            Constructor<?>[] declaredconstructors = class1.getDeclaredConstructors();
            for(Constructor<?> c : declaredconstructors) { 
                System.out.println(c);
            }
            System.out.println("-------------------公有的有參構造方法--------------------------------");
            //獲取公有的有參構造方法
            Constructor<?> declaredcons1 = class1.getConstructor(new Class[] {Double.class,int.class});
            System.out.println(declaredcons1);
            System.out.println("-------------------私有的有參構造--------------------------------");
            //獲取私有的有參構造
            Constructor<?> declaredconstructor1 = class1.getDeclaredConstructor(new Class[] {String.class,int.class});
            System.out.println(declaredconstructor1);
        } catch (Exception e) {
                e.printStackTrace();
        }
    }

執行結果:

com.xnrd.common.base.Person
------------------所有公用的構造方法---------------------------------
public com.xnrd.common.base.Person(java.lang.String,java.lang.Double,int)
public com.xnrd.common.base.Person(java.lang.Double,int)
public com.xnrd.common.base.Person(int)
public com.xnrd.common.base.Person()
-------------------所有的構造方法(包括私有的)--------------------------------
public com.xnrd.common.base.Person(java.lang.String,java.lang.Double,int)
private com.xnrd.common.base.Person(java.lang.String,int)
public com.xnrd.common.base.Person(java.lang.Double,int)
public com.xnrd.common.base.Person(int)
public com.xnrd.common.base.Person()
-------------------公有的有參構造方法--------------------------------
public com.xnrd.common.base.Person(java.lang.Double,int)
-------------------私有的有參構造--------------------------------
private com.xnrd.common.base.Person(java.lang.String,int)

二、反射獲取字段並使用

 public static void  getFilds() {
        try {
            Class<?> class1 = Class.forName("com.xnrd.common.base.Person");
            System.out.println("-------------------所有公有字段--------------------------------");
            //獲取所有公有字段
            Field[] fildFields = class1.getFields();
            for(Field field : fildFields) {
                System.out.println(field);
            }
            System.out.println("-------------------所有字段(包括私有)--------------------------------");
            //獲取所有字段(包括私有)
            Field[] fields = class1.getDeclaredFields();
            for(Field field : fields) {
                System.out.println(field);
            }
            //獲取指定的字段
            Field field = class1.getField("height");
            //獲取一個公有的無參構造,然后實例化,並給字段賦值
            Object object = class1.getConstructor().newInstance();
            field.set(object, "166");
            System.out.println("-------------------測試字段設置是否成功--------------------------------");
            //測試是否設置成功
            Person person  = (Person)object;
            System.out.println(person.getHeight());
            System.out.println("-------------------獲取私有字段並使用--------------------------------");
            Field field2 = class1.getDeclaredField("age");
            field2.setAccessible(true);     //暴力反射  獲取私有字段必須添加此行
            field2.set(object, 25);
            System.out.println(person.getAge());
        } catch (Exception e) {
                e.printStackTrace();
        }
    }

 執行結果:

-------------------所有公有字段--------------------------------
public java.lang.String com.xnrd.common.base.Person.height
public java.lang.Double com.xnrd.common.base.Person.weight
-------------------所有字段(包括私有)--------------------------------
public java.lang.String com.xnrd.common.base.Person.height
public java.lang.Double com.xnrd.common.base.Person.weight
private int com.xnrd.common.base.Person.age
-------------------測試字段設置是否成功--------------------------------
166
-------------------獲取私有字段並使用--------------------------------
25

三、反射獲取方法並調用方法 

public static void  getMethod() {
        try {
            Class<?> class1 = Class.forName("com.xnrd.common.base.Person");
            System.out.println("-------------------獲取類中公有的方法--------------------------------");
            //獲取所有public 修飾的方法
            Method[] methods = class1.getMethods();
            for(Method method : methods) {
                System.out.println(method);
            }
            System.out.println("-------------------獲取類中的所有方法--------------------------------");
            //獲取所有的方法(包括私有的)
            Method[] methods2 = class1.getDeclaredMethods();
            for(Method method : methods2) {
                System.out.println(method);
            }
            System.out.println("-------------------獲取類中的指定方法並使用--------------------------------");
            Method method = class1.getMethod("methodOne", String.class);
            System.out.println(method);
            System.out.println("-------------------獲取類中指定的不帶參數的方法並使用--------------------------------");
            Method method2 = class1.getDeclaredMethod("methodTwo");
            System.out.println(method2);
            System.out.println("-------------------獲取類中指定的帶多個參數的方法並使用--------------------------------");
            //若methodThree方法前修飾符是public 則用getMethod
            Method method3 = class1.getDeclaredMethod("methodThree", String.class,Double.class,int.class);
            System.out.println(method3);
            //實例化對象,驗證方法是否獲取成功
            Object object = class1.getConstructor().newInstance();
            //調用方法
            Object invObject =  method3.invoke(object, "166",3.14,25);
            System.out.println(invObject);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 執行結果:

-------------------獲取類中公有的方法--------------------------------
public static void com.xnrd.common.base.Person.main(java.lang.String[])
public int com.xnrd.common.base.Person.getAge()
public java.lang.String com.xnrd.common.base.Person.getHeight()
public void com.xnrd.common.base.Person.setHeight(java.lang.String)
public void com.xnrd.common.base.Person.setWeight(java.lang.Double)
public java.lang.Double com.xnrd.common.base.Person.getWeight()
public void com.xnrd.common.base.Person.setAge(int)
public void com.xnrd.common.base.Person.methodOne(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
-------------------獲取類中的所有方法--------------------------------
public static void com.xnrd.common.base.Person.main(java.lang.String[])
public int com.xnrd.common.base.Person.getAge()
public java.lang.String com.xnrd.common.base.Person.getHeight()
public void com.xnrd.common.base.Person.setHeight(java.lang.String)
protected void com.xnrd.common.base.Person.methodFour()
public void com.xnrd.common.base.Person.setWeight(java.lang.Double)
java.lang.String com.xnrd.common.base.Person.methodThree(java.lang.String,java.lang.Double,int)
public java.lang.Double com.xnrd.common.base.Person.getWeight()
private void com.xnrd.common.base.Person.methodTwo()
public void com.xnrd.common.base.Person.setAge(int)
public void com.xnrd.common.base.Person.methodOne(java.lang.String)
-------------------獲取類中的指定方法並使用--------------------------------
public void com.xnrd.common.base.Person.methodOne(java.lang.String)
-------------------獲取類中指定的不帶參數的方法並使用--------------------------------
private void com.xnrd.common.base.Person.methodTwo()
-------------------獲取類中指定的帶多個參數的方法並使用--------------------------------
java.lang.String com.xnrd.common.base.Person.methodThree(java.lang.String,java.lang.Double,int)
我是第三個方法!
1663.1425

四、反射調用main方法

 public static void  getMainMethod() {
        try {
            Class<?> class1 = Class.forName("com.xnrd.common.base.Person");
            System.out.println("------------------調用main方法---------------------------------");
            Method method = class1.getMethod("main", String[].class);
            method.invoke(null, (Object) new String[] {"a"});
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

 執行結果:

------------------調用main方法---------------------------------
Person的main方法執行成功!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM