1注解概述:注解能够加强咱们的java代码,同时利用反射技术能够裁减实现很多性能。它们被广泛应用于三大框架底层。传统咱们通过xml文本文件申明形式,而当初最支流的开发都是基于注解形式,代码量少,框架能够依据注解去主动生成很多代码,从而缩小代码量,程序更易读。例如最火爆的SpringBoot就齐全基于注解技术实现。
分类:1、JDK自带注解2、元注解3、自定义注解
JDK注解:JDK注解的注解,就5个:1、@Override2、@Deprecated标记就表明这个办法曾经过期了,但我就要用,别提醒我过期3、@SuppressWarnings(“deprecation”) 疏忽正告4、@SafeVarargs jdk1.7呈现,堆净化,不罕用5、@FunctionallInterface jdk1.8呈现,配合函数式编程拉姆达表达式,不罕用
元注解:形容注解的注解,就5个:1、@Target 注解用在哪里:类上、办法上、属性上
ElementType.FIELD 利用于字段或属性ElementType.METHOD 利用于办法级ElementType.TYPE 利用于类的元素2、@Retention 注解的生命周期:源文件中、class文件中、运行中
RetentionPolicy.RUNTIME 在运行时无效3、@Inherited 容许子注解继承4、@Documented 生成javadoc时会蕴含注解,不罕用5、@Repeatable注解为可反复类型注解,能够在同一个中央屡次应用,不罕用
自定义注解:
//一,自定义注解:@interface 注解名//形容注解能够呈现的地位--多个地位上用@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.SOURCE)//形容注解的生命周期@interface Test{ //1,给注解增加性能--属性--语法非凡 String local()default "";//3,给属性设置默认值,不便间接应用@Test String value();//5,非凡的属性value}//二,应用注解:@Test//@Test(local="class")//2,当Test注解增加了属性时,须要给属性赋值class taotao{ String name;// @Test//4,因为属性设置好了默认值,用时就简略了// @Test("123")//6,因为value属性比拟非凡,能够简写,赋值时省略掉value= @Test(local = "method",value="")//7,给多个属性赋值时,不能省略value= public void show(){ System.out.println("show()..."); }}2反射概述:Reflection(反射) 是 Java 程序开发语言的特色之一,它容许运行中的 Java 程序对本身进行查看,或者说“自审“,也有称作“自省”。反射十分弱小,它甚至能间接操作程序的公有属性。咱们后面学习都有一个概念,private的只能类外部拜访,内部是不行的,但这个规定被反射赤裸裸的突破了。
反射就像一面镜子,它能够在运行时获取一个类的所有信息,能够获取到任何定义的信息(包含成员变量,成员办法,结构器等),并且能够操纵类的字段、办法、结构器等局部。
2.1创建对象Class.forName(“类的全门路”);类名.class对象.getClass();测试:
//形式1: Class.forName("类的全门路"); Class clazz = Class.forName("java.lang.String");//形式2: 类名.class Class clazz2 = String.class;//形式3: 对象.getClass(); Class clazz3 = new String().getClass();2.2罕用办法测试:
public static void main(String[] args) throws Exception {// method();//获取Class对象// method2();//获取构造方法// method3();//获取成员办法// method4();//获取成员变量// method5();//通过反射创建对象 } public static void method5() throws Exception { //1,获取Class对象 Class<Test2_Student> a = Test2_Student.class; //2,调用实例化办法 -- 也要触发构造方法,而且触发的是无参结构 //java.lang.InstantiationException没有无参结构报异样 Test2_Student as = a.newInstance(); System.out.println("as="+as); //重写toString()前:as=day18.Test2_Student@15db9742 //重写toString()后:as=Test2_Student [name=null, age=0, score=0.0] //怎么触发含参结构--匹配构造方法里 参数列表 Constructor<Test2_Student> ass = a.getConstructor(String.class);//指定 //X是创建对象时间隔的参数 Test2_Student ass2 = ass.newInstance("jack"); System.out.println("ass2="+ass2); //创立2个参数的构造方法 Constructor<Test2_Student> bss = a.getConstructor(String.class,int.class,double.class); Test2_Student bsss = bss.newInstance("taotao",20,20.1); System.out.println("bsss="+bsss); } //获取成员变量 public static void method4() { //1,获取Class对象 Class a = Test2_Student.class; //2,获取所有的成员变量--只能获取到public润饰的变量 Field[] as = a.getFields(); //3,遍历数组,失去每个变量ass for(Field ass:as) { //4,获取变量名 System.out.println(ass.getName()); //5,获取变量类型 System.out.println(ass.getType().getName()); } } //获取成员办法 public static void method3() { //1,获取Class对象 Class<Test2_Student> a = Test2_Student.class; //2,获取所有成员办法们 --包含本人的和父类的 Method[] as = a.getMethods(); //3,遍历数组,失去每个办法ass for(Method ass:as) { //4,获取办法名 System.out.println(ass.getName()); //5,获取办法的参数的类型 Class[] asss = ass.getParameterTypes(); System.out.println(Arrays.toString(asss)); } } //获取构造方法 public static void method2() { //1,获取Class对象 --封装了.class文件里的所有数据 Class c1 = Test2_Student.class; //2,调用办法// --取得所有公开的构造方法,并存入数组 Constructor[] cs = c1.getConstructors(); //3,获取每个构造方法 for(Constructor css:cs) { //4,获取构造方法的名字 System.out.println(css.getName()); //5,获取构造方法的参数 Class[] css1=css.getParameterTypes(); System.out.println(Arrays.toString(css1)); } } //获取Class对象 public static void method() throws ClassNotFoundException {// Class.forName(“类的全门路”);// 类名.class// 对象.getClass(); Class c = Class.forName("test.reflect.Test3_Reflect2"); Class c1 = Test3_Reflect2.class; Class c2 = new Test3_Reflect2().getClass(); }2.3暴力反射根本API:
...