Java反射机制,是在程序的运行过程中,对于任何一个类,都可能晓得它的所有属性和办法。对于任意一个对象,都可能晓得调用他的任意属性和办法。这种动静获取信息以及动静调用对象办法的性能称为Java语言的反射机制。

如下代码示例:

  • 父类Animal
package com.study.reflection;public class Animal {    public String name;    public int age;    public Animal() {        super();    }    public Animal(String name, int age) {        this.name = name;        this.age = age;    }    public void eat() {    }    public String getInfo() {        return "name:" + this.name + ", age:" + age;    }}
  • 子类Cat,继承Animal
package com.study.reflection;public class Cat extends Animal {    public String color;    private String owner;    String sex;    public Cat() {        super();    }    public Cat(String name, int age, String color, String owner) {        super(name, age);        this.color = color;        this.owner = owner;    }    public Cat(String owner) {        this.owner = owner;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    void mie() {    }    private void smile() {        System.out.println(name + "在笑");    }    public void cry() {        System.out.println(name + "在哭");    }    @Override    public String toString() {        return "姓名:" + this.name + ", 年龄:" + this.age + ", 色彩:" + color + ", 客人:" + owner;    }}
  • 测试类TestReflect
package com.study.reflection;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class TestReflect {    public static void main(String[] args) {        Class cat = null;        try {            cat = Class.forName("com.study.reflection.Cat");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        //获取对象的所有私有(public)属性,例如:public String color;包含继承的父类中public润饰的属性        Field[] fields = cat.getFields();        for (Field f : fields) {            //输入后果:            // public java.lang.String com.study.reflection.Cat.color            // public java.lang.String com.study.reflection.Animal.name            // public int com.study.reflection.Animal.age            System.out.println(f);        }        System.out.println("==========================================================");        //获取对象所有属性(不论是public还是private或者没有修饰符的润饰的属性),但不包含继承的父类中的属性        Field[] declaredFields = cat.getDeclaredFields();        for (Field df : declaredFields) {            //输入后果:            //public java.lang.String com.study.reflection.Cat.color            //private java.lang.String com.study.reflection.Cat.owner            //java.lang.String com.study.reflection.Cat.sex            System.out.println(df);        }        System.out.println("==========================================================");        //获取对象的所有公共(public)办法;包含继承的父类中的public润饰的办法以及Object类中public润饰的办法        Method[] methods = cat.getMethods();        for (Method m : methods) {            //输入后果:            //public java.lang.String com.study.reflection.Cat.toString()            //public void com.study.reflection.Cat.setColor(java.lang.String)            //public java.lang.String com.study.reflection.Cat.getColor()            //public void com.study.reflection.Cat.cry()            //public void com.study.reflection.Animal.eat()            //public java.lang.String com.study.reflection.Animal.getInfo()            //public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException            //public final void java.lang.Object.wait() 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 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()            System.out.println(m);        }        System.out.println("==========================================================");        //获取对象所有办法(不论是public还是private或者没有修饰符的润饰的办法),但不包含继承的父类中的办法        Method[] declaredMethods = cat.getDeclaredMethods();        for (Method dm : declaredMethods) {            //输入后果:            //public java.lang.String com.study.reflection.Cat.toString()            //public void com.study.reflection.Cat.setColor(java.lang.String)            //public java.lang.String com.study.reflection.Cat.getColor()            //void com.study.reflection.Cat.mie()            //private void com.study.reflection.Cat.smile()            //public void com.study.reflection.Cat.cry()            System.out.println(dm);        }        System.out.println("==========================================================");        //获取对象的所有公共(public)构造方法,但不包含继承的父类中的构造方法        Constructor[] constructors = cat.getConstructors();        for (Constructor c : constructors) {            //输入后果:            //public com.study.reflection.Cat(java.lang.String)            //public com.study.reflection.Cat(java.lang.String,int,java.lang.String,java.lang.String)            //public com.study.reflection.Cat()            System.out.println(c);        }        System.out.println("==========================================================");        //获取对象的所有构造方法,        Constructor[] declaredConstructors = cat.getDeclaredConstructors();        for (Constructor dc : declaredConstructors) {            //输入后果:            //public com.study.reflection.Cat(java.lang.String)            //public com.study.reflection.Cat(java.lang.String,int,java.lang.String,java.lang.String)            //public com.study.reflection.Cat()            System.out.println(dc);        }        System.out.println("==========================================================");        //Cat cat1 = (Cat) cat.newInstance();//此办法在Java9之后显示已过期        Constructor<Cat> constructor = null;        try {            //获取全参数构造函数            constructor = cat.getConstructor(String.class, int.class, String.class, String.class);        } catch (NoSuchMethodException e) {            e.printStackTrace();        }        Cat cat1 = null;        try {            //应用构造函数赋值初始化            cat1 = constructor.newInstance("花花", 2, "红色", "小明");        } catch (InstantiationException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (InvocationTargetException e) {            e.printStackTrace();        }        //输入后果:        //姓名:花花, 年龄:2, 色彩:红色, 客人:小明        System.out.println(cat1);        System.out.println("==========================================================");        //获取指定办法,并执行,【获取的办法必须是public润饰的】        Method cry = null;        try {            //输入后果:            //花花在哭            cry = cat.getMethod("cry");//cry()办法        } catch (NoSuchMethodException e) {            e.printStackTrace();        }        Object object = null;        try {            object = cry.invoke(cat1);//调用cry()办法        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (InvocationTargetException e) {            e.printStackTrace();        }    }}