注释 类加载器 动态代理

类加载器

*         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

时间: 2024-10-30 00:14:10

注释 类加载器 动态代理的相关文章

类加载与动态代理

动态代理 所谓动态,就是在运行期间生成代理类.不然,有100个需要被代理的类,你就得手动写100个代理类,代码膨胀得厉害. 而我现在的目标是弄清楚jdk如何实现动态代理. 阅读Proxy类的源码能够看清大体流程: 1.我们自己提供接口和类加载器,然后jdk去通过Class.forName的方式去加载以及初始化这些接口,并生成类型信息. 2.有了这些接口的类型信息,就可以通过反射得到所有的方法的信息 3.这个时候有2种选择:通过已有的信息生成代理类的java源代码文件,然后动态编译生成class文

C#使用Emit构造拦截器动态代理类

在AOP编程概念介绍中,常见的示例为拦截对象,并在对象的某方法执行前和执行后分别记录日志. 而最常用的拦截方式是使用动态代理类,用其封装一个日志拦截器,当方法被执行时进行日志记录. 日志拦截器类 1 public class Interceptor 2 { 3 public object Invoke(object @object, string @method, object[] parameters) 4 { 5 Console.WriteLine( 6 string.Format("Int

深入探讨 Java 类加载器

转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式.加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™中的应用. 类加载器是 Java 语言的一个创新,也是

深入理解Java类加载器(1):Java类加载原理解析

1 基本信息 每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的部分,虽然和大部分开发人员直接打交道不多,但是对其背后的机理有一定理解有助于排查程序中出现的类加载失败等技术问题,对理解java虚拟机的连接模型和java语言的动态性都有很大帮助. 2 Java虚拟机类加载器结构简述 2.1 JVM三种预定义类型类加载器 我们首先看一下JVM预定义的三种类型类加载器

Java类加载器ClassLoader总结

JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中. 2.显式装载, 通过class.forname()等方法,显式加载需要的类 类加载的动态性体现: 一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是

Java静态代理与动态代理模式的实现

前言:    在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一

jdk 动态代理 数据连接池

package com.itheima.datasource; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayL

java类加载器(转)

类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的.Java Applet 需要从远程下载 Java 类文件到浏览器中并执行.现在类加载器在 Web 容器和 OSGi 中得到了广泛的使用.一般来说,Java 应用的开发人员不需要直接同类加载器进行交互.Java 虚拟机默认的行为就已经足够满足大多数情况的需求了.

侃侃静态代理和动态代理

前言: 在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一个标记