凡客帆布鞋,莱芜seo排名,wordpress微信登录插件下载,公司vi设计包括哪些注解
什么是注解
注解#xff08;Annotation#xff09;#xff0c;就是 Java 代码里面的特殊标记#xff0c;例如 Override、Test 等作用#xff1a;让其他程序根据注解信息来决定怎么执行该程序注意#xff1a;注解可以用在类上、构造器上、方法上、成员变量上、参数…注解
什么是注解
注解Annotation就是 Java 代码里面的特殊标记例如 Override、Test 等作用让其他程序根据注解信息来决定怎么执行该程序注意注解可以用在类上、构造器上、方法上、成员变量上、参数上…注解的本质是一个接口Java 中所有注解都是继承了 Annotation 接口的注解(…) 其实就是一个实现类对象实现了该注解以及 Annotation 接口
自定义注解
// 自定义注解
public interface MyTest {String aaa();boolean bbb() default true;String[] ccc();
}// 方法部分
MyTest(aaa Jack, ccc {Java, HTML})
public void run() {}特殊属性名value——如果注解中只有一个 value 属性使用注解时value 名称可以不写
public interface MyTest {String value(); // 特殊属性
}public interface MyTest {String value(); // 特殊属性int age() default 23; // 当有默认值时候可以不删除此行
}MyTest(Jack)
public void run() {}元注解
元注解指的是修饰注解的注解
TargetElemeElenntType.TYPE作用声明被修饰的注解只能在哪些位置使用TYPE类接口FIELD成员变量METHOD成员方法PARAMETER方法参数CONSTRUCTOR构造器LOCAL_VARIABLE局部变量
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;Target({ElemeElenntType.TYPE,ElementType.METHOD}) // 当前被修饰的注解只能用在类和成员方法上
public interface MyTest {
}Retention(RetentionPolicy.RUNTIME)作用声明注解的保留周期SOURCE只作用在源码阶段字节码文件中不存在CLASS默认值保留到字节码文件阶段运行阶段不存在RUNTIME开发常用一直保留到运行阶段
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 MyTest {
}注解的解析
什么是注解的解析
就是判断类上、方法上、成员变量上是否存在注解并把注解里的内容给解析出来
如何解析注解
思想要解析谁上面的注解就应该先拿到谁
// 自定义注解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 MyTest {String value();double aaa() default 100;String[] bbb();
}// 在类和方法上使用注解MyTest(value Jack, aaa 99.8, bbb {Java, HTML})
public class Demo {public static void main(String[] args) {}MyTest(value Tony, aaa 88.6, bbb {java, html})public void run() {}
}// 解析类上的注解import org.junit.Test;
import java.util.Arrays;
public class AnnotationTest {Testpublic void parseClass() {// 1. 先得到 Class 对象Class c Demo.class;// 2. 解析类上的注解// 判断这个类上是否包含了某个注解if (c.isAnnotationPresent(MyTest.class)) {MyTest myTest (MyTest) c.getDeclaredAnnotation(MyTest.class);System.out.println(myTest.value());System.out.println(myTest.aaa());System.out.println(Arrays.toString(myTest.bbb()));}}
}
/*
运行结果:Jack99.8[Java, HTML]*/// 解析方法上的注解import org.junit.Test;
import java.lang.reflect.Method;
import java.util.Arrays;public class AnnotationTest {Testpublic void parseMethod() throws Exception {// 1. 先得到 Class 对象然后通过 Class 对象获取方法对象Class c Demo.class;Method m c.getDeclaredMethod(run);// 2. 解析方法上的注解// 判断这个方法上是否包含了某个注解if (m.isAnnotationPresent(MyTest.class)) {MyTest myTest (MyTest) m.getDeclaredAnnotation(MyTest.class);System.out.println(myTest.value());System.out.println(myTest.aaa());System.out.println(Arrays.toString(myTest.bbb()));}}
}
/*
运行结果:Tony88.6[java, html]*/应用场景
案例模拟 Junit 框架
// 需求定义若干个方法只要加了MyTest注解就会触发该方法的执行
/* 分析1.定义一个自定义注解 MyTest只能注解方法存活范围是一直都在2.定义若干个方法部分方法加上 MyTest 注解修饰部分方法不加3.模拟一个 Junit 程序可以触发加了 MyTest 注解的方法执行
*/// 自定义注解部分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 {}// 模拟框架部分import java.lang.reflect.Method;public class AnnotationTest {public void test1() {System.out.println(test1);}MyTestpublic void test2() {System.out.println(test2);}public void test3() {System.out.println(test3);}MyTestpublic void test4() {System.out.println(test4);}public static void main(String[] args) throws Exception {AnnotationTest a new AnnotationTest();// 启动程序// 1. 得到 Class 对象Class c AnnotationTest.class;// 2. 提取这个类中的全部成员方法Method[] methods c.getDeclaredMethods();// 3. 遍历获取到每个方法对象看看其方法上是否存在 MyTest 注解// 如果存在则触发该方法执行for (Method method : methods) {if (method.isAnnotationPresent(MyTest.class)) {method.invoke(a); // 触发当前方法执行}}}
}
/*
运行结果:test2test4*/动态代理
代理将一些通用部分的代码提取出来交给代理去实现类比 Python 的装饰器
// 创建一个明星类前置工作// 明星类
public class Star implements Agent {private String name;public Star(String name) {this.name name;}// 唱歌方法public String sing(String title) {System.out.println(this.name 正在唱 title);return Think everyone!;}// 跳舞方法public void dance() {System.out.println(this.name 正在跳舞);}
}// 创建一个代理人接口前置工作// 代理人接口
public interface Agent {String sing(String name);void dance();
}// 创建一个工具类即能制作出代理人的公司前置工作import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// 中介公司类
public class ProxyUtil {// 创建代理对象的静态方法public static Agent createProxy(Star sss) {/*public static Object newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h)参数一用于指定一个类加载器参数二指定生成的代理长什么样子也就是有哪些方法参数三用来指定生成的代理对象要干什么事情*/Agent starProxy (Agent) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), // 参数一new Class[]{Agent.class}, // 参数二new InvocationHandler() { // 参数三Override // 回调方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 代理对象要做的事情请在这里写代码if (method.getName().equals(sing)) {System.out.println(准备话筒收钱20W);} else if (method.getName().equals(dance)) {System.out.println(准备场地收钱99W);}return method.invoke(sss, args);}});return starProxy; // 本静态方法的最后是————返回创建好的代理对象}
}// 调用工具类让公司为某个明星对象去定制一个专属代理人正式部分public class Test {public static void main(String[] args) {// 创建一个明星叫迈克尔-杰克逊Star star new Star(Michael-Jackson);// 为迈克尔-杰克逊创建一个代理人Agent agent ProxyUtil.createProxy(star);System.out.println(agent.sing(新年好)); // 让代理人安排他唱歌System.out.println(-----------------);agent.dance(); // 让代理人安排他跳舞}
}/* 运行结果:准备话筒收钱20WMichael-Jackson正在唱新年好Think everyone!-----------------准备场地收钱99WMichael-Jackson正在跳舞*/