注释 类加载器 动态代理

Posted junqiang-ma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注释 类加载器 动态代理相关的知识,希望对你有一定的参考价值。

类加载器

 *         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:调用方法传入的实际参数

 

以上是关于注释 类加载器 动态代理的主要内容,如果未能解决你的问题,请参考以下文章

类加载器|注解|动态代理

类加载器+注解+动态代理

JAVAWEB学习笔记25_基础加强:类加载器注解 @xxx和动态代理

反射与类加载之ClassLoader与类加载器

Java进阶学习第24天——动态代理与类加载器

Junit-@Annotation-动态代理-类加载器