19Java语法回顾之反射

来源:互联网 发布:行业大盘数据分析 编辑:程序博客网 时间:2024/06/06 16:50

Java语法回顾之反射


读了那么多年的书让我明白一个道理。人要稳重,不要想到啥就做啥。做一行越久即使你不会,几年之后慢慢的你也会了,加上一点努力你或许你能成为别人眼中的专家。

反射获取字节码文件

/* * 反射:在运行状态下,通过class文件对象(Class的对象),去使用构造方法,成员变量,成员方法。 *  * 那么,我们是如何获取到class文件对象的呢?(字节码文件对象) * A:Object类的getClass()方法。 * B:数据类型的静态的class属性 * C:通过Class类的静态方法forName(String className) *  * 到底使用哪一种呢? * 开发中用第三种。自己写例子测试可以使用前两种。 * 因为第三种方式可以结合配置文件使用。 */

反射获取字节码文件

/** * 通过反射获取字节码文件 */public class MyReflect {    public static void main(String[] args) throws ClassNotFoundException {        MyPerson my = new MyPerson();        Class<? extends MyPerson> myClass = my.getClass();        MyPerson mp = new MyPerson();        Class<? extends MyPerson> aClass = mp.getClass();        System.out.println(myClass.equals(aClass));//true        Class<MyPerson> myPersonClass = MyPerson.class;        System.out.println(aClass==myPersonClass);//true        //第三种,开发时使用的方式        Class aClass1 = Class.forName("cn.itcast_01.MyPerson");        System.out.println(myPersonClass==aClass1);//true    }}

通过反射获取构造方法

/** * 反射获取构造方法并使用。 * <p/> * 构造方法     Constructor * 成员变量     Field * 成员方法     Method */public class MyReflect {    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {        Class<?> aClass = Class.forName("cn.itcast_01.MyPerson");        //获取构造器对象        // 一般我们创建对象,只要一个构造方法就可以了,所以,我们只需要获取一个构造方法即可。        Constructor<?> constructor = aClass.getConstructor();        //带参构造方法        Constructor<?> constructor2 = aClass.getConstructor(int.class,String.class);        //通过Constructor创建实例对象        Object o = constructor.newInstance();        Object hsia = constructor2.newInstance(23, "Hsia");        System.out.println("无参构造"+o);        System.out.println("带参构造"+hsia);        System.out.println("*******************");    }}

反射获取成员变量并使用

/** * 获取私有成员变量并使用 */public class MyReflectField {    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {        //获取字节码文件        Class<?> c = Class.forName("cn.itcast_01.MyPerson");        //创建对象        Constructor<?> constructor = c.getConstructor();        Object obj = constructor.newInstance();        //没有设置值之前的obj对象        System.out.println("初始化前的值:" + obj);        //获取共有字段名称        Field age = c.getField("age");        //给共有字段设置值        age.set(obj, 23);        //获取私有字段        Field name = c.getDeclaredField("name");        //暴力访问        name.setAccessible(true);//不要限制我。        name.set(obj, "Hsia");//报错   java.lang.IllegalAccessException:        //设置值后的对象        System.out.println("初始化后的值:" + obj);    }}

反射获取成员方法并使用

/** * 获取成员方法并使用。 */public class MyReflect {    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {        //获取字节码文件        Class<?> c = Class.forName("cn.itcast_01.MyPerson");        //创建对象        Constructor<?> constructor = c.getConstructor();        Object obj = constructor.newInstance();        //1.获取成员方法 无参无返回值        Method show = c.getMethod("show");        show.invoke(obj,null);        System.out.println("——————————————————");        //2.获取成员方法 带参无返回值        Method function = c.getMethod("function",String.class);        function.invoke(obj,"Hsia");        System.out.println("——————————————————");        //3.获取成员方法 带参有返回值        Method reutrnValue = c.getMethod("reutrnValue", String.class, int.class);        //return 的返回值        Object hsia = reutrnValue.invoke(obj, "Hsia", 23);        System.out.println(hsia);        System.out.println("——————————————————");        //4.获取私有成员方法        Method helloworld = c.getDeclaredMethod("hello");        //设置暴力访问        helloworld.setAccessible(true);        helloworld.invoke(obj,null);    }}
0 0