类加载器
* bootstrap 根类加载器 核心包下的类 不是类
* ext 扩展类加载器 扩展包下的类
* app 应用加载器 自定义的类 第三提供的类
*
* Class
* ClassLoader getClassLoader()获取类加载器
* ClassLoader
* ClassLoader getParent() 获取父加载器>
注解:
java.lang.reflect.AnnotatedElement 接口
* 方法
* boolean isAnnotationPresent(要判断的那个注解的字节码文件 MyAnnotaion4.class)
* 判断对象上是否有注解 如果要获取MyAnnotaion4这个注解 参数就传入MyAnnotation4.class
* 返回值是boolean 有则为true 没有则为false
* MyAnnotation4 getAnnotation(要获取的那个注解的字节码文件 MyAnnotation4.class) 获取注解
自定义注解 :
* 格式
* 修饰符 @interface 注解名{
*
* }
注解的属性定义
* 固定格式
* 修饰符 返回值类型 属性名() [default 属性值]
* 修饰符:public abstract
* 返回值类型:基本类型 字符串 Class 枚举 其他注解 以上有所有类型的一维数组
* 属性名:自定义
特殊的属性名 value
* 当且仅当 注解中只有一个属性 并且这个属性叫value时 value在赋值时可以省略不写
元注解
* @Retention 用于确定被修饰的自定义注解生命周期
* 源码中 source
* 源码中 编译后的class中 class
* 源码中 编译的class中 运行的class中 runtime
* @Target 用于确定被修饰的自定义注解使用位置
* type 类
* method 方法
* Constructor 构造方法
* field 字段
注解的使用
* 注解可以没有属性,如果有属性需要使用小括号括住。例如:@MyAnno1或@MyAnno1()
* 属性格式:属性名=属性值,多个属性使用逗号分隔。例如:@MyAnno2(username="rose")
* 如果属性名为value,且当前只有一个属性,value可以省略。
* 如果使用多个属性时,k的名称为value不能省略
* 如果属性类型为数组,设置内容格式为:{ 1,2,3 }。例如:arrs = {"it","it"}
* 如果属性类型为数组,值只有一个{} 可以省略的。例如:arrs = "itcast"
* 一个对象上,注解只能使用一次,不能重复使用。
* 如果属性没有默认值 则必须为属性赋值 如果属性有默认值则可以不赋值
<--案例:
public class Demo01_GetAnnotation {
@MyAnnotation04(age = 18, name = "liuyan")
public void method() {
}
@Test
public void getAnno() {
// 获取Demo01_GetAnnotation的字节码文件对象
Class c = Demo01_GetAnnotation.class;
// 获取字节码文件对象的所有方法
Method[] methods = c.getMethods();
// 遍历 判断哪个方法上有@MyAnnotation04这个注解
for (Method m : methods) {
// 判断方法上是否有注解
boolean b = m.isAnnotationPresent(MyAnnotation04.class);
// System.out.println(b+".."+m.getName());
//// 如果有 则获取这个注解
if (b) {
MyAnnotation04 my4 = m.getAnnotation(MyAnnotation04.class);
// 根据注解获取属性值
int age = my4.age();
System.out.println(age);
String name = my4.name();
System.out.println(name);
}
}
}
}
---->
<动态代理>
java.lang.reflect.Proxy
* static Object newProxyInstance(
* ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 生成代理对象
* 返回值
* Object:返回的就是代理对象 Actor
* 参数
* ClassLoader loader:类加载器 Actor类的类加载器 Actor.class.getClassLoader
* Class[] interfaces:Person类实现的所有接口 a.getClass.getInterfaces
* InvocationHandler h:接口 方法的参数是一个接口 需要给其实现类对象 匿名内部类 new InvocationHandler(){ 重写方法}
*
* InvocationHandler的方法
* Object invoke(Object proxy, Method method, Object[] args)
* 返回值
* Object: 调用方法产生返回值 用Object类型接口 sing run
* 参数
* Object proxy:代理对象 与你无关
* Method method:你调用了哪个方法 这个method就是哪个方法
* Object[] args:调用方法传入的实际参数
原文地址:https://www.cnblogs.com/JunQiang-Ma/p/9963983.html