本帖最后由 小石姐姐 于 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();
|
|