zoukankan      html  css  js  c++  java
  • 反射

     反射:将类的各个组成部分封装为其他对象,这就是反射机制
            * 好处:
                1. 可以在程序运行过程中,操作这些对象。
                2. 可以解耦,提高程序的可扩展性。

    获取Class对象的方式:
            1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
                * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
            2. 类名.class:通过类名的属性class获取
                * 多用于参数的传递
            3. 对象.getClass():getClass()方法在Object类中定义着。
                * 多用于对象的获取字节码的方式

            * 结论:
                同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

     1 public class Reflecttest {
     2 public static void main(String[] args) throws ClassNotFoundException{
     3     //方式1Class.forName("全类名")
     4     Class c = Class.forName("reflect2.Person");
     5     System.out.println(c);
     6     //方式2 类名.class:通过类名的属性class获取
     7     Class c1 = Person.class;
     8     System.out.println(c1);
     9     //方式3对象.getClass():getClass()方法在Object类中定义着。
    10     Person p = new Person();
    11     Class c2 =  p.getClass();
    12     System.out.println(c2);
    13     //结论同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
    14 }
    15 }

    获取功能:

                                1. 获取成员变量们

                                         * Field[] getFields() :获取所有public修饰的成员变量

                                         * Field getField(String name)   获取指定名称的 public修饰的成员变量

                                         * Field[] getDeclaredFields()  获取所有的成员变量,不考虑修饰符

                                         * Field getDeclaredField(String name) 

                                2. 获取构造方法们

                                         * Constructor<?>[] getConstructors() 

                                         * Constructor<T> getConstructor(类<?>... parameterTypes) 

                                         * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) 

                                         * Constructor<?>[] getDeclaredConstructors() 

                                3. 获取成员方法们:

                                         * Method[] getMethods() 

                                         * Method getMethod(String name, 类<?>... parameterTypes) 

                                         * Method[] getDeclaredMethods() 

                                         * Method getDeclaredMethod(String name, 类<?>... parameterTypes) 

                                4. 获取全类名       

                                         * String getName() 

    Class personClass=Person.class;
            Field[]  fields=personClass.getFields();
            for (Field field : fields) {//iter
                System.out.println("getFileds(): "+field);
            }
    
            Field field=personClass.getField("a");
            System.out.println("getField(): "+field);
            System.out.println("=====================================================");
    
    
            Field a=personClass.getField("a");
            Person p=new Person();
            Object value=a.get(p);
            System.out.println(p);
            a.set(p,1);
            System.out.println(p);
    
    
            System.out.println("=====================================================");
    
            Field[] fiels2=personClass.getDeclaredFields();
            for (Field field2 : fiels2) {
                System.out.println("getDeclaredFields(): "+field2);
            }
    
            Field field3=personClass.getDeclaredField("name");
            System.out.println("getDeclaredField(): "+field3);
    •    练习Class对象功能_获取Constructor
    Class personClass=Person.class;
            Constructor constructor=personClass.getConstructor();
            Object p1=constructor.newInstance();
            System.out.println(p1);
            System.out.println("=========================================");
    
    
            Constructor constructor1=personClass.getConstructor(String.class,String.class);
            Object person1=constructor1.newInstance("aaa","bbb");
            System.out.println(person1);
            System.out.println("=========================================");
    
            Object person=personClass.newInstance();
            System.out.println(person);
    • 练习class对象获取Method
      Class personClass=Person.class;
              Method[] methods=personClass.getMethods();
              for (Method method : methods) {
                  System.out.println(method);
              }
              System.out.println("=============================");
      
              Method method01=personClass.getMethod("eat");
              Person person=new Person();
              method01.invoke(person);
              System.out.println("==============================");
              Method method02=personClass.getMethod("eat",String.class);
              method02.invoke(person,"zhangsan")
  • 相关阅读:
    关于多态的一些问题
    003 关于shell基础,大数据的前期准备
    002 在大数据中基础的llinux基本命令
    013 MapReduce八股文的wordcount应用
    接口里语句的修饰问题
    Apache Rewrite url重定向功能的简单配置
    学习笔记 --- 缓存、动态页面静态化、网站优化
    使用PHP连接、操纵Memcached的原理和教程
    Apache中关于页面缓存的设置
    缓存(之一) 使用Apache Httpd实现http缓存
  • 原文地址:https://www.cnblogs.com/lsymove/p/11259277.html
Copyright © 2011-2022 走看看