系列文章目录
注解和动态代理的基本内容
前言
一、注解的应用
1.注解概述
2.自定义注解
3.元注解
4.注解解析
package org.example.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Book {
String value();
double price() default 100;
String[] author();
}
package org.example.annotation;
@Book(value = "《西游记》",price = 26.0,author = {"吴承恩"})
public class BookStore {
@Book(value = "《红楼梦》",price = 99.0,author = {"罗贯中"})
public void test(){}
}
package org.example.annotation;
import org.junit.Test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;
public class AnnotaionDemo {
@Test
public void praseClass(){
//a.先得到类对象
Class c = BookStore.class;
//b.判断这个类上面是否存在这个注解
if (c.isAnnotationPresent(Book.class)){
//c.直接获取注解对象
Book book = (Book) c.getDeclaredAnnotation(Book.class);
System.out.println(book.value());
System.out.println(book.price());
System.out.println(Arrays.toString(book.author()));
}
}
@Test
public void praseMethod() throws Exception {
//a.先得到类对象
Class c = BookStore.class;
Method m=c.getDeclaredMethod("test");
//b.判断这个类上面是否存在这个注解
if (m.isAnnotationPresent(Book.class)){
//c.直接获取注解对象
Book book = (Book) m.getDeclaredAnnotation(Book.class);
System.out.println(book.value());
System.out.println(book.price());
System.out.println(Arrays.toString(book.author()));
}
}
}
5.注解的应用场景
package org.example.annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class AnnotationDemo2 {
public void test1(){
System.out.println("=======test1==========");
}
public void test2(){
System.out.println("=======test2==========");
}
@MyTest
public void test3(){
System.out.println("=======test3==========");
}
/**
* 启动菜单:有注解的才被调用
*/
public static void main(String[] args) throws Exception {
AnnotationDemo2 t=new AnnotationDemo2();
//a.获取类对象
Class c = AnnotationDemo2.class;
//b.获取全部方法
Method[] m = c.getDeclaredMethods();
//c.遍历方法,看是否有MyTest注解
for (Method method : m) {
if (method.isAnnotationPresent(MyTest.class)){
//跑它
method.invoke(t);
}
}
}
}
package org.example.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
二、动态代理
1.动态代理概述和快速入门
实际用到的对象类
package org.example.proxy;
public class Star implements Skill{
private String name;
public Star(String name) {
this.name = name;
}
@Override
public void jump() {
System.out.println(name+"开始跳舞,跳的很迷人~~");
}
@Override
public void sing() {
System.out.println(name+"开始唱歌,唱的很好听~~");
}
}
要实现的接口
package org.example.proxy;
public interface Skill {
void jump();
void sing();
}
代理类
package org.example.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 代理类
*/
public class StarAgentProxy {
/**
* 设计一个方法返回一个明星对象的代理对象
*
*/
public static Skill getProxy(Star obj){
//为杨超越这个对象返回一个代理对象
return (Skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("收首付款。。。");
//让真正的杨超越去唱歌和跳舞
//method 正在调用的方法 args 代表这个方法的参数
Object rs = method.invoke(obj, args);
System.out.println("收尾款,把杨超越接回来");
return rs;
}
});
}
}
测试类
package org.example.proxy;
public class Test {
public static void main(String[] args) {
//1.创建一个对象,对象的类必须实现接口
Star s=new Star("杨超越");
//2.为杨超越生成一个代理对象(经纪人)
Skill s2 = StarAgentProxy.getProxy(s);
s2.jump();//走代理的
s2.sing();
}
}
2.动态代理的应用案例
总结
重点学习动态代理的实现方式,了解其优点。