一个简单的Java反射实现

477 阅读1分钟
package reflect;

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

public class Apple extends Fruits {

    public Apple() {
        System.out.println("Constructor: Apple");
    }

    @Override
    void getFruitColor() {
        super.getFruitColor();
        System.out.println("RED");
    }

    @Override
    void getFruitName() {
        super.getFruitName();
        System.out.println("Apple");
    }
}

class doReflect{

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        // 1.获取类
        Class<?> clazz = Class.forName("reflect.Apple");
        System.out.println("获取类:"+clazz);

        // 2.获取构造
        Constructor constructor = clazz.getConstructor();
        System.out.println("获取构造:"+constructor);

        // 3.获取方法
        Object bean = clazz.newInstance(); // 必须实例化
        System.out.println(bean.toString());

        // 3.1 获取声明方法
        Method[] methods = bean.getClass().getDeclaredMethods();
        System.out.println("---------getDeclaredMethods");
        for (Method m : methods) {
            System.out.println(m);
        }
//        void reflect.Apple.getFruitColor()
//        void reflect.Apple.getFruitName()

        // 3.2 获取方法
        Method[] methods2 = bean.getClass().getMethods();
        System.out.println("---------getMethods");
        for (Method m : methods2) {
            System.out.println(m);
        }
//        ---------getMethods
//        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()

        // 3.3 调用方法
        Method method = bean.getClass().getDeclaredMethod("getFruitColor");
        System.out.println("调用方法:");
        method.invoke(bean);
    }

}