zoukankan      html  css  js  c++  java
  • java复习基础篇——反射

      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
       简单来说, 就可以把.class文件比做动物的尸体, 而反射技术就是对尸体的一种解剖.通过反射技术, 我们可以拿到该字节码文件中所有的东西, 例如成员变量, 成员方法, 构造方法, 而且还包括私有。

      字节码文件的三种获取方式:

    1. 对象名.getCalss();           // 次方法来自于Object对象已经存在的情况下,可以使用这种方式
    2. 类名.class                                //类名.class这是一个静态的属性,只要知道类名,就可以获取
    3. Class.forName(“com.lfh.Student”);     // 通过Class类中的静态方法,指定字符串,该字符串是类的全类名(包名+类名)

      获取构造方法:

     //获取字节码对象
            Class clazz = Class.forName("myReflectDemo.student1");
            //调用无参数构造方法
            Constructor cs =clazz.getConstructor();
            //System.out.println(cs);
            //调用有参数构造方法
            Constructor css = clazz.getConstructor(String.class,int.class);
            Object obj =css.newInstance("zhangsan",15);
            System.out.println(css);
            System.out.println(obj);
            System.out.println("---------------");
            //可以直接使用clazz.newInstance(),直接调用!!!
            Object obj1 = clazz.newInstance();
            System.out.println(obj1);

      获取成员变量:

    Class clazz = Class.forName("myReflectDemo.student1");
            Object obj = clazz.newInstance();
            // 访问所有的成员变量 返回数组
            Field[] f = clazz.getDeclaredFields();
            for (int i = 0; i < f.length; i++) {
                Field field = f[i];
                System.out.println(field);
            }
            // 返回指定的私有成员变量
            Field name = clazz.getDeclaredField("name");
            Field age = clazz.getDeclaredField("age");
            age.set(obj, 18);
            System.out.println(age.get(obj));
            // 私有成员变量必须设置开关 不然无法访问和修改!!!(让jvm不检查权限)
            name.setAccessible(true);
            // 传进来的是obj [ clazz.newInstance() ] 不是name
            name.set(obj, "lisi");
            System.out.println(name.get(obj));

      获取成员方法:

      Class clazz = Class.forName("myReflectDemo.student1");
            Object obj = clazz.newInstance();
            /*返回所有方法
             * Method[] md =clazz.getDeclaredMethods();
            for (int i = 0; i < md.length; i++) {
                Method method = md[i];
                System.out.println(method);
            }*/
            //获取无参数无返回值的方法
            Method m = clazz.getDeclaredMethod("method");
            m.invoke(obj);
            //获取有参数无返回值的方法
            Method m2 =clazz.getDeclaredMethod("method",String.class);
            m2.invoke(obj, "信息");
            //获取无参数有返回值的方法
            Method m3 =clazz.getDeclaredMethod("getName");
            System.out.println(m3.invoke(obj));
           

  • 相关阅读:
    DDD:再谈:实体能否处于非法状态?
    EntityFramework:迁移工具入门
    技术人生:态度决定人生
    EntityFramework:EF Migrations Command Reference
    DDD:聊天笔记
    DCI:DCI学习总结
    DCI:The DCI Architecture: A New Vision of Object-Oriented Programming
    设计原则:消除Switch...Case的过程,可能有点过度设计了。
    .NET:动态代理的 “5 + 1” 模式
    Silverlight:《Pro Silverlight5》读书笔记 之 Dependency Properties And Routed Event
  • 原文地址:https://www.cnblogs.com/unrulywind/p/9094284.html
Copyright © 2011-2022 走看看