天天看點

Java知識【反射知識(2)】

2.4反射擷取成員變量并使用【應用】

2.4.1Class類擷取成員變量對象的方法

  • 方法分類
方法名 說明
Field[] getFields() 傳回所有公共成員變量對象的數組
Field[] getDeclaredFields() 傳回所有成員變量對象的數組
Field getField(String name) 傳回單個公共成員變量對象
Field getDeclaredField(String name) 傳回單個成員變量對象
  • 示例代碼
public class Student {

    public String name;

    public int age;

    public String gender;

    private int money = 300;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", money=" + money +
                '}';
    }
}
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
       // method1();
        //method2();
        //method3();
        //method4();

    }

    private static void method4() throws ClassNotFoundException, NoSuchFieldException {
        //        Field getDeclaredField(String name):傳回單個成員變量對象
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");
  
        //2.擷取money成員變量
        Field field = clazz.getDeclaredField("money");
  
        //3.列印一下
        System.out.println(field);
    }
  
    private static void method3() throws ClassNotFoundException, NoSuchFieldException {
        //        Field getField(String name):傳回單個公共成員變量對象
        //想要擷取的成員變量必須是真實存在的
        //且必須是public修飾的.
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");
  
        //2.擷取name這個成員變量
        //Field field = clazz.getField("name");
        //Field field = clazz.getField("name1");
        Field field = clazz.getField("money");
  
        //3.列印一下
        System.out.println(field);
    }
  
    private static void method2() throws ClassNotFoundException {
        //        Field[] getDeclaredFields():傳回所有成員變量對象的數組
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");
  
        //2.擷取所有的Field對象
        Field[] fields = clazz.getDeclaredFields();
  
        //3.周遊
        for (Field field : fields) {
            System.out.println(field);
        }
    }
  
    private static void method1() throws ClassNotFoundException {
        //        Field[] getFields():傳回所有公共成員變量對象的數組
  
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");
  
        //2.擷取Field對象.
        Field[] fields = clazz.getFields();
  
        //3.周遊
        for (Field field : fields) {
            System.out.println(field);
        }
    }
}      

2.4.2Field類用于給成員變量指派的方法

  • 方法介紹
方法名 說明
void set(Object obj, Object value) 指派
Object get(Object obj) 擷取值
  • 示例代碼
// Student類同上一個示例,這裡就不在重複提供了
public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
//        Object get(Object obj) 傳回由該 Field表示的字段在指定對象上的值。
        //method1();
        //method2();

    }

    private static void method2() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");

        //2.擷取成員變量Field的對象
        Field field = clazz.getDeclaredField("money");

        //3.取消一下通路檢查
        field.setAccessible(true);

        //4.調用get方法來擷取值
        //4.1建立一個對象
        Student student = (Student) clazz.newInstance();
        //4.2擷取指定對象的money的值
        Object o = field.get(student);

        //5.列印一下
        System.out.println(o);
    }

    private static void method1() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
        //        void set(Object obj, Object value):給obj對象的成員變量指派為value
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect4.Student");

        //2.擷取name這個Field對象
        Field field = clazz.getField("name");

        //3.利用set方法進行指派.
        //3.1先建立一個Student對象
        Student student = (Student) clazz.newInstance();
        //3.2有了對象才可以給指定對象進行指派
        field.set(student,"zhangsan");

        System.out.println(student);
    }
}      

2.5反射擷取成員方法并使用【應用】

2.5.1Class類擷取成員方法對象的方法

  • 方法分類
方法名 說明
Method[] getMethods() 傳回所有公共成員方法對象的數組,包括繼承的
Method[] getDeclaredMethods() 傳回所有成員方法對象的數組,不包括繼承的
Method getMethod(String name, Class<?>… parameterTypes) 傳回單個公共成員方法對象
Method getDeclaredMethod(String name, Class<?>… parameterTypes) 傳回單個成員方法對象
  • 示例代碼
public class Student {

    //私有的,無參無傳回值
    private void show() {
        System.out.println("私有的show方法,無參無傳回值");
    }

    //公共的,無參無傳回值
    public void function1() {
        System.out.println("function1方法,無參無傳回值");
    }

    //公共的,有參無傳回值
    public void function2(String name) {
        System.out.println("function2方法,有參無傳回值,參數為" + name);
    }

    //公共的,無參有傳回值
    public String function3() {
        System.out.println("function3方法,無參有傳回值");
        return "aaa";
    }

    //公共的,有參有傳回值
    public String function4(String name) {
        System.out.println("function4方法,有參有傳回值,參數為" + name);
        return "aaa";
    }
}
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //method1();
        //method2();
        //method3();
        //method4();
        //method5();
    }

    private static void method5() throws ClassNotFoundException, NoSuchMethodException {
        //        Method getDeclaredMethod(String name, Class<?>... parameterTypes):
//                                傳回單個成員方法對象
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect5.Student");
        //2.擷取一個成員方法show
        Method method = clazz.getDeclaredMethod("show");
        //3.列印一下
        System.out.println(method);
    }
  
    private static void method4() throws ClassNotFoundException, NoSuchMethodException {
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect5.Student");
        //2.擷取一個有形參的方法function2
        Method method = clazz.getMethod("function2", String.class);
        //3.列印一下
        System.out.println(method);
    }
  
    private static void method3() throws ClassNotFoundException, NoSuchMethodException {
        //        Method getMethod(String name, Class<?>... parameterTypes) :
//                                傳回單個公共成員方法對象
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect5.Student");
        //2.擷取成員方法function1
        Method method1 = clazz.getMethod("function1");
        //3.列印一下
        System.out.println(method1);
    }
  
    private static void method2() throws ClassNotFoundException {
        //        Method[] getDeclaredMethods():
//                                傳回所有成員方法對象的數組,不包括繼承的
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect5.Student");
  
        //2.擷取Method對象
        Method[] methods = clazz.getDeclaredMethods();
        //3.周遊一下數組
        for (Method method : methods) {
            System.out.println(method);
        }
    }
  
    private static void method1() throws ClassNotFoundException {
        //        Method[] getMethods():傳回所有公共成員方法對象的數組,包括繼承的
        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect5.Student");
        //2.擷取成員方法對象
        Method[] methods = clazz.getMethods();
        //3.周遊
        for (Method method : methods) {
            System.out.println(method);
        }
    }
}      

2.5.2Method類用于執行方法的方法

  • 方法介紹
方法名 說明
Object invoke(Object obj, Object… args) 運作方法

參數一: 用obj對象調用該方法

  • 示例代碼
public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
//        Object invoke(Object obj, Object... args):運作方法
//        參數一:用obj對象調用該方法
//        參數二:調用方法的傳遞的參數(如果沒有就不寫)
//        傳回值:方法的傳回值(如果沒有就不寫)

        //1.擷取class對象
        Class clazz = Class.forName("com.itheima.myreflect5.Student");
        //2.擷取裡面的Method對象  function4
        Method method = clazz.getMethod("function4", String.class);
        //3.運作function4方法就可以了
        //3.1建立一個Student對象,當做方法的調用者
        Student student = (Student) clazz.newInstance();
        //3.2運作方法
        Object result = method.invoke(student, "zhangsan");
        //4.列印一下傳回值
        System.out.println(result);
    }
}      

繼續閱讀