A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-4-24 17:13 编辑

                        JavaSE_day13_反射_BeanUtils_动态代理
反射
    一 定义
     在运行时期中,通过字节码对象动态获取该类的所有成员(成员变量,成员方法,构造方法,包括私有的)
     并能进行调用。
     
   二 字节码对象三种获取方式
       对象.getClass();  类名.class ;Class.forName("类全名")
      
   三 反射-构造方法、成员方法、成员变量 以构造方法为例 其它一样。
        getConstructor() 只能是获取到public修饰的
        getDeclaredConstructor() 可以获取到所有的,不管什么权限修饰符。
        如果不是private修饰的,可以直接调用,但如果是private修饰的,需要通过
        setAccessible(true)来打破private权限。
        getConstructors()和getDeclaredConstructor() 同上,只是返回的是数组。
        
javabean规范
        1 类使用公共进行修饰
        2 提供私有修饰的成员变量
        3 为成员变量提供公共getter和setter方法
        4 提供公共无参的构造
        5 实现Serializable接口

BeanUtils工具 使用前需要导二个包 commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar
        1 populate(obj,map) 将对象的属性用一个map集合进行封装,并灌进obj对象中,
                                     需要obj对象满足javabean规范
        
            Person p = new Person();
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("name", "lisi");
            map.put("age", 18);
            map.put("gender", "male");
            BeanUtils.populate(p,map);
            
动态代理
    JDK代理和CGLIB,JDK代理的是接口,CGLIB代理的是类(后续补充)。
    jdk代理 代码实现:
    interface Foo {
        void show();
    }
    class FooImpl implements Foo {
       public void show() {
          System.out.println("foo");
       }
    }
    FooImpl foo = new FooImpl();
    Foo f = (Foo)Proxy.newProxyInstance(foo.getClass().getClassLoader(), foo.getClass().getInterfaces(),
    new InvocationHandler(){
            public Object invoke(Object proxy, Method method, Object[] args){
                method.invoke(foo,args);
            }
    });
    f.show();



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马