java Class中得到構造方法Constructor、方法Method、字段Field


常用方法:

Constructor類用於描述類中的構造方法:

Constructor<T> getConstructor(Class<?>... parameterTypes)

返回該Class對象表示類的指定的public構造方法;

Constructor<?>[] getConstructors()

返回該Class對象表示類的所有public構造方法;

Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

返回該Class對象表示類的指定的構造方法,和訪問權限無關;

Constructor<?>[] getDeclaredConstructors()

返回該Class對象表示類的所有構造方法,和訪問權限無關;

 

Method類用於描述類中的方法:

Method getMethod(String name, Class<?> ... parameterTypes)

返回該Class對象表示類和其父類的指定的public方法;

Method[] getMethods(): 

返回該Class對象表示類和其父類的所有public方法;

Method getDeclaredMethod(String name, Class<?>... parameterTypes)

返回該Class對象表示類的指定的方法。和訪問權限無關,但不包括繼承的方法;

Method[] getDeclaredMethods(): 獲得類所有的方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法;

 

Eg:

package junereflect624;

 

import java.lang.reflect.Constructor;

 

class Emp{

    private String name;

    private int age;

    private Emp() {

    }

    Emp(String name){

    }

    public Emp(String name,int age){

    }

}

 

public class ConstructorDemo4 {

    public static void main(String[] args) throws Exception {

        //得到所有的構造器(先得到類)

        Class<Emp> c = Emp.class;

        /**

         * Constructor<?>[] getConstructors()

                返回一個包含某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的所有公共構造方法。

         */

        Constructor[] con = c.getConstructors();//前面的修飾符必須是public才可以在這個方法下獲取到

        for (Constructor cons : con) {

            System.out.println("c.getConstructors()"+cons);//如果上面的某構造器public去掉,則顯示不出

            /**打印

                public junereflect624.Emp(java.lang.String,int)

             */

        }

       

        //得到指定的構造器,也是必須public

        Constructor c1 = c.getConstructor(String.class,int.class);

        System.out.println(c1);//public junereflect624.Emp(java.lang.String,int)

                                     

System.out.println("====================================");

    //現在想獲得不受public影響的,getDeclaredConstructors(),暴力反射

       

        con = c.getDeclaredConstructors();

        for (Constructor cons : con) {

                         

System.out.println("c.getDeclaredConstructors()=="+cons);//此時不受修飾符的影響

            /**打印

             *  public junereflect624.Emp()

                public junereflect624.Emp(java.lang.String)

                public junereflect624.Emp(java.lang.String,int)

             */

        }

    }

}

 

 

package junereflect624;

 

import java.lang.annotation.Annotation;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

class AB{

    protected String name;

    protected String id;

}

@Deprecated

public class MethodDemo5 extends AB{

    void show(){}

    public void say(){}

    private int age;

    public char c;

    private boolean b;

    public static void main(String[] args) throws Exception {

        Class<MethodDemo5> c = MethodDemo5.class;

        //獲取所有的(包含父類的方法)public修飾的方法

        Method[] m = c.getMethods();

        for (Method method : m) {

            System.out.println(method);

        }

        //總結:4個方法,獲取全部,獲取特定;不受修飾符影響的全部,不受修飾符影響的特定;(前兩個都還是受限制的)

       

        //獲取指定的方法

        Method me = c.getMethod("main", String[].class);

        System.out.println("main "+me);//main public static void junereflect624.MethodDemo5.main(java.lang.String[]) throws java.lang.Exception

       

        //訪問所有方法,不受訪問權限影響

        m = c.getDeclaredMethods();

        for (Method method : m) {

            System.out.println("不受影響的:"+method);

        }

       

        me = c.getDeclaredMethod("show");

        System.out.println(me);//void junereflect624.MethodDemo.show()

 

        me = c.getMethod("toString");

        System.out.println(me);//public java.lang.String java.lang.Object.toString()

       

        /**

         * Method[] getDeclaredMethods()

                  返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,

                  包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法,只可以對當前類有效

         */

        /*me = c.getDeclaredMethod("toString");//ERROR,c.getDeclaredMethod()不能得到繼承的方法

        System.out.println(me);//public java.lang.String java.lang.Object.toString()

         */

        //得到字段

        Field[] f = c.getFields();

        for (Field field : f) {//只得到了public的

            System.out.println("字段"+field);

        }

       

        //特定字段

        Field fi = c.getField("c");//""里面是名稱

        System.out.println(fi);//public char junereflect624.MethodDemo.c

       

        //得到不受限定名限定的全部字段

        f = c.getDeclaredFields();

        for (Field field : f) {//得到不受修飾符限定的字段,但是只對當前類有效

            System.out.println("全部字段:"+field);

            /**

             *  全部字段:private int junereflect624.MethodDemo.age

                全部字段:public char junereflect624.MethodDemo.c

                全部字段:private boolean junereflect624.MethodDemo.b

             */

        }

        //注釋  Annotation

         Annotation[] a = c.getAnnotations();

         System.out.println(a.length);

         for (Annotation annotation : a) {

            System.out.println(annotation);

        }

         

         //特定注解

         Deprecated d = c.getAnnotation(Deprecated.class);

         System.out.println(d);

    }

}

 

獲取當前對象的字段:

package july78javaEnhance;

 

import java.lang.reflect.Field;

 

class Stu{

    public String name;

    public String sex;

    public int age;

   

    public Stu(String name, String sex, int age) {

        super();

        this.name = name;

        this.sex = sex;

        this.age = age;

    }

}

 

public class ReflectDemo6 {

    public static void main(String[] args) throws Exception {

        Stu s = new Stu("劉昭", "男", 12);

       

        Class<Stu> c = Stu.class;

       

        Field f = c.getField("name");

        System.out.println(f.get(s));////從哪個對象身上取!此時顯示劉昭!

//  修改對象的值

/**

Field f = c.getField("name");

        f.set(s,"章澤天");

System.out.println(f.get(s));//從哪個對象身上取!//此時顯示章澤天

*/

    }

}

 

 

我的總結:對於方法,字段,構造方法之類用類獲取記住四個:獲取全部,獲取特定,暴力獲取全部,暴力獲取特定!


免責聲明!

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



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