反射:
1.动态语言,具备反射机制
a.运行时,判断任意一个类的对象的所属类
b.构造任意一个类的对象实例
c.判断任意一个类的成员变量和方法
d.调用任意一个对象的成员变量和方法
e.生成动态代理
Java中核心的API:
java.lang.Class/.reflect.Method/Filed/Constructor(代表类的构造方法)
Class获取方式:
1.通过类名.Class
2.通过对象实例.getClass()
3.Class.forName()
4.classLoder.loadClass();//不常用
反射:
1.得到Object类
Object obj = new Person();
2.调用对象的getClass方法得到类的名称
Class clazz = obj.getClass();
反射调用:
m.invoke(obj,”文康宇”);
m.getAnnotation(Override.class)-->SpringMVC拿到注解的方法 注解将配置信息存放在其中
通过类的实例获得方法的实例
Method m = clazz.getMethod(“setName”,String.class);
Method getM = clazz.getMethod(“getName”)
System.out.println(getM);
/*也可以将Object强转为Person对象*/
类的加载过程:
1.类的加载:将类的class文件读取进内存,并创建一个java.lang.Class对象 过程由类加载器完成
2.类的连接:将类的二进制数据合并到jre中
3.类的初始化:JVM对类进行初始化-->包含静态代码 对象等
ClassLoder(类加载器):
JVM定义了两种类的加载器:bootstrap(启动类加载器) user-defined classloader (用户自定义)
JVM在运行时产生3个类加载器的组成的层次结构:
bootstrap(C++编写的,负责java平台的核心类库加载)-->extension(扩展类加载器,用来加载jre/lib/ext目录下的jar包 扩展包)-->system(负责classpath目录下的jar包)
使用反射调用private:
Method m = clazz.getDeclaredMethod(“setName”,String.calss)
m.setAccessible(true)//是否可以操作
AOP两种方式:Spring jdk(反射结合Proxy) cglib(修改字节码)
动态代理:程序员通过代理类来调用其他对象的方法,并且在程序运行时根据需要动态创建目标类的代理对象。
Proxy是所有动态代理类的父类。实现动态代理就离不开接口、业务实现类、代理对象。
1.需要一个代理类 2.通过反射机制调用对象的方法-->invoke方法
给你一个object实例、方法名字、参数列表-->用这些做事情
一个接口-->业务实现类实现接口-->代理对象ProxyHandler,必须实现InvocationHandler
@override
public Object invoke(Object proxy,Method method,Object[] args) {
method.invoke(proxy,args);
}