Java之反射程式碼演示說明

Java仗劍走天涯發表於2017-05-05

還不存在的類–即我們需要使用反射來使用的類

Person類:

package com.qf.demo4;

public class Person {

    private String name;
    public int age;
    static int weight;
    int male;
    protected int num;

    public Person(String name, int age, int weight) {
        this.name = name;
        this.age = age;
        this.weight = weight;
        System.out.println("有引數的構造方法");
    }

    public Person() {
        System.out.println("無引數的構造方法");
    }

    public void eat() {
        System.out.println("吃");
    }

    public void drink(String type) {
        System.out.println("喝" + type);
    }

    public String sleep() {
        System.out.println("睡");
        return "呵呵";
    }

    private void play() {
        System.out.println("玩");
    }

    public static void hehe() {
        System.out.println("heheheheh");
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ",weight = "+weight+"]";
    }
}

演示程式碼:


Test1:建立Class物件

package com.qf.demo4;

import com.qf.demo.Person;
/**
 * 每一個類只有一個class 物件
 * com.qf.demo.Person 包名+類名  全限定名
 * @author Administrator
 *
 */
public class Test {

    public static void main(String[] args) {
        // 建立Class 物件
        // 第一種方式:類.class
        Class class1 = Person.class;
        System.out.println(class1.hashCode());
        // 第二種方式:建立類的物件;然後--物件.getClass()
        Person person = new Person();
        Class class2 = person.getClass();
        System.out.println(class2.hashCode());


        // 第三種方式:使用forname方法,引數為相對於本工程的地址
        try {
            Class class3 = Class.forName("com.qf.demo.Person");
            System.out.println(class3.hashCode());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Test2:建立Constructor物件,並建立Person類(還沒有的類)物件

package com.qf.demo4;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test2 {

    public static void main(String[] args) {

        try {
            Class class1 = Class.forName("com.qf.demo4.Person");
            Constructor[] constructors = class1.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor);
            }


            // 1 通過構造方法建立  Perosn物件
            Constructor constructor = class1.getConstructor(null);// 得到無參的構造方法
            Person person = (Person) constructor.newInstance(null);
            System.out.println(person);


            // 2 利用有引數的構造方法建立物件
            Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
            Person person2 = (Person) constructor2.newInstance("張三",5,9);
            System.out.println(person2);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Test3:獲取方法,以及呼叫方法

package com.qf.demo4;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test3 {

    public static void main(String[] args) {
        try {
            Class class1 = Class.forName("com.qf.demo4.Person");
            // 得到構造方法
            Constructor constructor = class1.getConstructor(null);
            Object object = constructor.newInstance(null);

            Method[] methods = class1.getMethods();// 得到本類和父類的非私有的方法

            Method[] methods2 = class1.getDeclaredMethods();// 得到本類中宣告的所有的方法(包括私有)

            // 得到 無參  無返回值的 方法並且呼叫
            Method method = class1.getMethod("eat", null);
            //            呼叫方法的物件    實際引數
            method.invoke(object, null);// 是哪個方法被呼叫

            // 呼叫  有引數 無返回值的方法
            Method method2 = class1.getMethod("drink", String.class);
            method2.invoke(object, "水");

            // 有返回值的
            Method method3 = class1.getMethod("sleep", null);
            Object  object2 = method3.invoke(object, null);// invoke方法的返回值就是呼叫的方法的返回值
            System.out.println(object2);

            // 得到靜態的方法
            Method method4 = class1.getMethod("hehe", null);
            method4.invoke(null, null);// 靜態方法不需要傳遞物件  直接寫null


            // 私有的   私有的方法 必須用 getDeclaredMethod 才能得到
            Method method5 = class1.getDeclaredMethod("play", null);
            method5.setAccessible(true);// 私有方法預設沒有許可權呼叫,必須單獨設定呼叫許可權
            method5.invoke(object, null);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

反射定義:http://blog.csdn.net/baidu_37107022/article/details/71234940

相關文章