一、注解
1、定义
- 注解不具备主动功能,就是为代码中的某一个成员做个标记。
- 注解的唯一作用:为方法、成员变量、类。。作标记注解随着代码进入编译器,当编译器编译时,识别注解后编译器会做出相应的反应。
- 至于能不能发挥作用,主要看检测这个标记的功能(类)。
例如:
@override:Java中的某个类(例如:编译器、扫描类)会扫描注解标记,并检测被标记的方法是否满足重写语法。
@SupperessWarning():
2、自定义注解
- 写一个类,关键字@interface
- 源注解:用来给注解注解
- @Target({ElementType.XXX,ElementType.XXX...})
设定当前定义的注解以后可以使用在什么位置。- @Retention(RetentionPolicy.XXX)
设定当前注解保留到什么时候。
SOURCE :保留到编译的时候
RUNNTIME:保存到运行的时候
CLASS:保存到字节码文件的时候
二、动态代理
静态代理是写个子类继承后通过子类代理
- 原始类
package com.qianfeng.part03;
public class Demo{
public String method(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "小红";
}
public void fn(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- 代理类
package com.qianfeng.part02;
//静态代理 Demo的代理类
public class SonDemo extends Demo{
@Override
public String method() {
long start = System.currentTimeMillis();
String str = super.method();
long end = System.currentTimeMillis();
System.out.println(end-start);
return str;
}
@Override
public void fn() {
long start = System.currentTimeMillis();
super.fn();
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
1、定义
- 代理: 本来应该自己做的事情,请了别人来做,被请的人就是代理对象
- 动态代理:在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理对象。
- 代理可以使我们在不破坏源代码的情况下增加新的功能。
2、 java中动态代理的使用
2.1、java中原生动态代理Proxy动态代理
- 在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象
- public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
- 最终会调用InvocationHandler的方法
- InvocationHandler Object invoke(Object proxy,Method method,Object[] args)
基本原理 - 利用对象的类的字节码接口,写出一个新的类到本地区,通过编译器直接编译成.class文件,再通过类加载器加载进来
- 弊端: 代理的对象必须实现接口
示例代码
- 原始类
package part02;
public class Demo implements MyInterface{
@Override
public void method() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("method方法执行了");
}
@Override
public void fn() {
// TODO Auto-generated method stub
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("fn方法执行了");
}
}
- 代理类
package part02;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestDemo {
public static void main(String[] args) {
Demo d=new Demo();
MyInterface my=(MyInterface) Proxy.newProxyInstance(d.getClass().getClassLoader(),
d.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long start =System.currentTimeMillis();
Object object = method.invoke(d, args);
long end=System.currentTimeMillis();
System.out.println(end-start);
return object;
}
});
my.fn();
my.method();
}
}
2.2、cglib 代理
定义
- 非java原生的动态代理, 效率更高,限制更小
- 可以代理没有接口的类
使用方法
Step 01:导包
Step 02:代码演示
package part03;
import java.lang.reflect.Method;
import org.apache.tools.ant.types.Commandline.Argument;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class TestDemo {
public static void main(String[] args) {
MethodInterceptor interceptor=new MethodInterceptor() {
//明确代理要干什么
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
long start=System.currentTimeMillis();
Object object = arg3.invokeSuper(arg0, arg2);
long end=System.currentTimeMillis();
System.out.println(end-start);
return object;
}
};
//创建代理工具类对象
Enhancer enhancer=new Enhancer();
//设置工作
enhancer.setCallback(interceptor);
//设置原始类
enhancer.setSuperclass(Demo.class);
//创建代理类对象
Demo d = (Demo) enhancer.create();
//执行方法
d.fn();
d.method();
}
}