注释(解释 说明 自己 别人留着的)
Java中的注解 Annotation(含有很多信息)
数组[]
类class 抽象类abstract 接口interface
注解@interface(从定义上 可以类比接口的定义特点 ) 枚举enum
如何自己定义注解
如何自己解析注解(信息)
变量
数组
集合
类
文件
数据库
不能停留于业务上,要往高的维度上去考虑,统筹地规划给别人解决问题的时候,站在一个高度上。
写完的代码不是为某一个程序服务的,是为了很多人服务的,
解决复用性、健壮性、解决灵活性、可扩展性,
包括解决内存当中的性能问题,这些是我们当中的设计而不仅仅是代码的实现功能。
而不应停留于代码的应用层面,写完的代码,底层的思想是什么样的呢。
package test;
import annotation.MyAnnotation;
public class Person{//用来描述好多人的 抽象的概念
//属性
public String name;
public String sex;
public String age;
//构造方法
//1.每一个类都有一个默认无参数的构造方法---默认存在
//2.构造方法也是方法 也存在构造方法重载
//使用我们自己创建的注解
@MyAnnotation(value={"某某","男","18"})
public Person(){}
public Person(String name,String sex,String age){
this.name=name;
this.sex=sex;
this.age=age;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
//方法
public void eat(){
System.out.println("人类吃饭的方法");
}
}
package test;
import annotation.ReadAnnotation;
public class TestMain{
public static void main(String[] args){
//1.创建对象
//Person p=new Person();//具体的对象
//2.调用属性 存值取值了
//p.name="某某";
//p.age=18;
//p.sex="男";
//第二种方式 利用构造方法传参数 创建对象
//Person p=new person("某某",18,"男");
//第三种方式 只创建一个对象 对象不是我们创建 别人创建
//创建对象的同时 自动赋值
//Person p=new Person();//就有属性值了 IOC ,DI设计思想
//调用这个构造方法 方法的上面多了一个注解 注解里面还存有数据 外部类等可以用反射去读取数据ReadAnnotation类
//3.调用方法、执行
//p.eat();
//如果采用上述的方法给对象赋值 创建对象+属性赋值==4行代码
//构造方法 构造对象的同时做一些事情 创建对象+属性赋值==1行
//构造方法传递的参数值很重要
//赋值过程就简单了
//参数临时的存储----参数存入集合 参数值存入文件(文件永久性保存)
//domain实体对象-----构造数据是从文件中读取出来 I/O 很多不同类 读取 解析
//数据库 为了让整个设计变得更加灵活 配置文件 properties xml
//在某一个位置添加一个小小的说明----带着一些数据
//注解产生——几个作用
//1.充当注解(仅仅是个说明 //)
//2.目的是为了编译时做一些检测 @Override
// 方法重写的时候 遵循很多规则 名字,参数列表必须与父类一致 修饰符 返回类型 异常
// public class MyClass extends Thread{
// @Override
// public void run(){
// //里面做的事情需要一些条件 Socket
// }
// }
//3.做后端开发 最主要的是数据 其次注意的是业务逻辑
//数据 (变量 数组 集合 对象)--临时
//数据 (文件txt properties xml 数据库)--永久 需要用I/O去读 解析 JDBC
//数据 (注解--跟代码在一起 改不了 可读性方便 小的数据注解里)
//注解用来存储和传递数据
//Spring框架 IOC控制反转 DI AOP JDBC MVC
//IOC设计思想是对象的创建交给别人来管理 对象的控制权反转 自己创建 交给别人创建
//对象中是存在属性的 别人给我创建对象还不够 对象中属性需要值
//DI设计思想 别人给我创建对象的同时 帮我将对象的属性值注入了进去(赋值)
ReadAnnotation r=new ReadAnnotation();
Person p=r.getBean(Person.class);
//什么样的东西会IOC?
//Controller Service Dao这样的对象都可以交给Spring来管理
//通常是Controller对象里面有一个service当属性,Service对象里面有一个Dao当属性,Dao对象里面有可能有一个sercol当属性.
//要一个Controller,controller里面其它的一套都有了,DI很强大。自动匹配,大量反射和注解。
//注解是xml的代替方案
//注解好在写起来简单,注解跟正常属性、方法在一起可读性增强,注解一个一个的。
//注解不好在于写完代码改不了,在一起打成包怎么改。
//xml好处在于,打成包以后,代码不能动,但xml文件内容还可以动。文件仍然可以改的。
//xml不好在于它结构过于庞大。一个文件全在这里。文件统一规则。
System.out.println(p);
}
}
package annotation;
//自己规定了一个结构 不足以说自己是一个注解
//需要大佬给你一个认证 给认证的大佬也是注解(元注解)
//1.注解放在什么地方使用(类 属性 方法 构造方法 参数)
//2.注解的生命周期(源代码 字节码 内存类中)
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//可否继承用这个元注解@Tnherited
//@documented
@Target(value = {ElementType.CONSTRUCTOR,ElementType.FIELD})//放在什么地方用:数组用在构造方法{[ElementType.CONSTRUCTOR]}、并且该数组用在属性值上ElementType.FIELD。如果不是数组,可去掉大括号。
//Annotation是在类上或接口上使用
@Retention(value =RetentionPolicy.RUNTIME)//注解的生命周期 有三个值:Class字节码 runtime运行时类 source源代码
//只有Runtime生命周期才能携带信息 被我们返问
//只有一个参数,并且参数为value时,value可省略
public @interface MyAnnotation{
//定义的写法---可以类比接口的写法 不一样
//接口是为了定义规则 注解是为了存储和传递信息
//接口
//1.接口里面有什么
// 属性 必须共有 静态 常量
// 方法 必须共有 抽象
// 代码块 没有
// 构造方法 没有
//2.是否能创建对象
//不能创建对象
//3.与别的类(抽象 接口)之间的关系
//接口只能是别的类来实现我
//注解
//长得跟接口很像
//public static final int test=10;//不常用 注解是为了存储和携带信息(不能一致)
//通常省了前面的修饰符public abstract
String[] value();
//int test();//必须有返回值 void不行 基本类型 String 枚举 注解 数组[加上那些]
//抽象方法 注解的方法恰恰是为了做事用 帮我们传递数据
//用户给的数据------参数 注解的方法就是解析
//注解自己不处理数据 数据的搬运工 数据给别人处理(返回值)
//自定义异常 自己写一个类 需要继承
}
package annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReadAnnotation{
public T getBean(Class clazz){
Object obj=null;
try{
//clazz那个类(Person)
//1.clazz类的构造方法上面
Constructor con=clazz.getConstructor();
obj=con.newInstance();//构造方法创建一个对象
//2.通过构造方法找寻上面的注解
Annotation anno=con.getAnnotation(MyAnnotation.class);
//3.将anno对象还原为真实类型
//方式一:对象调用
//MyAnnotation ma=(MyAnnotation)anno;
//String[] value=ma.value();
//方式二:反射操作
Class annoClass=anno.getClass();//获取注解类
Method method=annoClass.getMethod("value");
String[] value=(String[]) method.invoke(anno);
//遍历value数据
for(int i=0;i 


