什么是动态代理?动态代理是相对于静态代理而言的,是指在程序运行期间,动态的创建出一个虚拟的代理对象。相较于静态代理,动态代理,只需要接口和目标类,不再需要一个真实的代理类了。基本语法import java.lang.reflect.Proxy; Proxy.newProxyInstance(){ loader, //类加载器(目标类的类加载器) interfaces, //接口数组(目标类和虚拟代理类的共同接口的字节码对象) h // 句柄接口(虚拟代理处理问题的具体实现) }具体实现,假设已经有了一个目标类Target,一个目标类的接口TargetInterface,一个方法show,一个带参方法say(int x)TargetInterface targetPorxy = Porxy.newProxyInstace(){ Target.class.getClassloader(), new class[]{TargetInterface.class}, new InvocationHandler(){ public Object invoke(Ob
静态代理,需要一个接口,和两个实现类(分别是代理类和目标类)。为什么需要接口?接口是规范,约定了实现类必须要完成的方法接口public interface IDemo(){ public void show(); }目标类public class Target implements IDemo(){ public void show(){ } }代理类public class proxy implements IDemo(){ public void show(){ // 代理调用目标类的方法 new Target().show(); } }
假设有如下一个类package com.wlmqtc public class Demo(){ }java 获取一个类的字节码对象,共有三种方法,概览:Demo.class new Demo().getClass() Class.forName("com.wlmqtc.Demo")类名.classClass clzz = Demo.class;对象.getClass()Demo demo = new Demo();Class clzz = demo.getClass();Class.forName(类的全包名)String className = "com.wlmqtc.Demo";Class clzz = Class.forName(className);
@interface是自定义注解的关键字public @interface myAnno(){ String url(); String ip(); }一个拥有两个成员的简单自定义注解定义成功了,就是这么简单。注意:注解的成员名后面必须有一个括号,如url()。为什么?没有为什么,这是语法要求……其他用法1public @interface myAnno(){ // 通过default关键字可以定义一个自带默认值的成员 String url() default "www.wlmqtc.com"; String ip(); }其他用法2public @interface myAnno(){ // 仅有一个成员,且成员名为value()时,使用时,可以省略成员名 String value(); }
元注解,是对注解进行注解,用于规范注解,比如自定义了一个注解,可能需要使用元注解@Target用于说明一个注解的作用目标,比如是作用在方法、字段、方法参数、构造函数、类上、还是包上示例:@Target({TYPE,FIELDMETHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})@Retention用于说明一个注解的作用范围,比如是在源文件、字节码文件、还是运行时有效示例:@Rentention(RetentionPolicy.SOURCE)以上示例表示,该注解只被保留在源文件阶段,编译为字节码后将被丢弃@Rentention的三个参数(或者说生命周期)RetentionPolicy.SOURCE 只在源码阶段存活RententionPolicy.CLASS 可以在源码和字节码阶段存活( 默认级别 )RententionPolicy.RUNTIME 源码(.java)、字节码(.class)、以及被JVM加载到内存 都是存活的
Minghui
却道天凉好个秋!
CC BY-NC-SA 4.0