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")
  • 相关阅读:
    C#操作REDIS例子
    A C# Framework for Interprocess Synchronization and Communication
    UTF8 GBK UTF8 GB2312 之间的区别和关系
    开源项目选型问题
    Mysql命令大全——入门经典
    RAM, SDRAM ,ROM, NAND FLASH, NOR FLASH 详解(引用)
    zabbix邮件报警通过脚本来发送邮件
    centos启动提示unexpected inconsistency RUN fsck MANUALLY
    rm 或者ls 报Argument list too long
    初遇Citymaker (六)
  • 原文地址:https://www.cnblogs.com/lsymove/p/11259277.html
Copyright © 2011-2022 走看看