反射
来源:互联网 发布: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);
因为表单数据中 某一些数据 可以是多选的