反射

来源:互联网 发布:linux删除用户组命令 编辑:程序博客网 时间:2024/06/07 00:58

1.反射的概念:

                 是一种运行时机制,在程序运行的时候,获取到JVM为.class文件生成的Class对象(字节码文件对象)

                           从而解剖这个Class对象,拿出对象中的构造,普通方法,成员字段,从而动态的创建对象,调用方法,给属性赋值

类的加载

当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

l  加载

就是指将class文件读入内存,并为之创建一个Class对象(画图)。

任何类被使用时系统都会建立一个Class对象

l  连接

校验加载的类是否有正确的内部结构

准备负责为类的静态成员分配内存,并设置默认初始化值  

解析将类的二进制数据中的符号引用替换为直接引用

l  初始化

给静态成员赋值,运行静态代码块等初始化工作

 

 2.获取Class对象的三种方式

                 类名.class;//每一个类 都有一个静态成员,这个成员在Object类中是看不见

        应用场景:确定类型等

         Class  clazz = person.class;

                 对象名.getClass();//一般不常用

 应用场景:在方法内部通过参数获得类型等

Person p = newPerson   Class clazz = p.getClass();

                 Class.forName("字符串类型的类的全限定类名");//最常用

 应用场景: 通过配置获得字符串等

Class.forName(“com.baidu.demo.Person”)

 3.通过CLASS对象获取里面的构造方法

                 public ConstructorgetConstructor();//无参的public构造

                 public ConstructorgetConstructor(参数类型.class);//有参的public构造

                   publicConstructor getDeclaredConstructor();//无参的构造(任何修饰符的)

                 public ConstructorgetDeclaredConstructor(参数类型.class);//有参的构造(任何修饰符的)

                 暴力访问(获取私有构造,创建对象):constructor.setAccessible(true);

 

                 public Constructor[]getConstructors();//获取所有的public构造

                 public Constructor[]getDeclaredConstructors();//获取所有的构造(任何修饰符的)

 

                

 4.通过CLASS对象获取里面的普通方法

                 public Method getMethod("方法名");//无参数的public方法

                 public Method getMethod("方法名",参数类型.class...);//有参数的public方法

 

 

                 public MethodgetDeclaradMethod("方法名");//无参数的方法(任何修饰符的)

                 public MethodgetDeclaradMethod("方法名",参数类型.class...);//有参数的方法(任何修饰符的)

 

 

                 public Method[] getMethods();//获取所有的public方法

                 public Method[]getDeclaredMethods();//获取所有的方法(任何修饰符的)

 

                

       

 5.通过CLASS对象获取里面的字段(了解)

                 public Field getField("字段名");//获取指定public字段

                 public FieldgetDeclaredField("字段名");//获取指定字段(任何修饰符的)

 

                 public Field[] getFields();//获取所有的public字段

                 public Field[]getDeclaredFields();//获取所有的字段(任何修饰符的)

 

 6.框架BeanUtils

                 JavaBean对象 专门用来存储数据类,比如Dog之类

                 一般来说JavaBean类,会保存到 一个叫"domain"的包

                

                 public void setProperty(Objectobj,String propertyName,Object propertyValue);

 

                 public String getProperty(Objectobj,String propertyName);

 

                 //在我们以后JavaWeb中很常用

                 public void populate(Objectobj,Map<String,String[]> map);

                           因为表单数据中  某一些数据 可以是多选的

                 

原创粉丝点击