1注解
概述:注解能够加强咱们的java代码,同时利用反射技术能够裁减实现很多性能。它们被广泛应用于三大框架底层。传统咱们通过xml文本文件申明形式,而当初最支流的开发都是基于注解形式,代码量少,框架能够依据注解去主动生成很多代码,从而缩小代码量,程序更易读。例如最火爆的SpringBoot就齐全基于注解技术实现。
分类:
1、JDK自带注解
2、元注解
3、自定义注解
JDK注解:
JDK注解的注解,就5个:
1、@Override
2、@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:
public static void main(String[] args) throws Exception {// method();//暴力反射成员办法们// method2();//暴力反射成员变量 public static void method2() throws Exception { Class<Person> a = Person.class; Field[] as = a.getDeclaredFields(); for(Field ass:as) { System.out.println(ass.getName()); System.out.println(ass.getType().getName()); } //获取指定的变量 Field f = a.getDeclaredField("score"); f.setAccessible(true); Object obj = a.newInstance(); //设置值--set(1,2)--1是指对象名称,2是要设置的具体值 f.set(obj, 20.0); //获取值--get(1)--1是指对象名称 System.out.println(f.get(obj)); } public static void method() throws Exception{ //1,获取Class对象 Class<Person> a = Person.class; //2,调用办法暴力反射 Method[] as = a.getDeclaredMethods(); //3,遍历数组,失去每个办法ass for(Method ass:as) { //4,获取办法名称 System.out.println(ass.getName()); //5,获取办法的参数的类型 Class<?>[] asss = ass.getParameterTypes(); System.out.println(Arrays.toString(asss)); } //暴力反射 某个办法 //getDeclaredMethod(1,2)--获取指定的办法 //--1是指办法名--2是指办法须要的参数类型的Class对象 Method m = a.getDeclaredMethod("game", String.class); Method m1 = a.getDeclaredMethod("eat"); //暴力反射:除了用对API,另外还须要开启拜访权限 m.setAccessible(true); //执行办法--invoke(1,2)--1是指对象名称--2是办法须要传入的参数 Object obj = a.newInstance(); m1.invoke(obj, null);// m.invoke(obj, "张三"); }
3外部类
概述:
如果一个类存在的意义就是为指定的另一个类,能够把这个类放入另一个类的外部。就是把类定义在类的外部的状况就能够造成外部类的模式。
A类中又定义了B类,B类就是外部类。B类能够当做A类的一个成员对待。
特点:
1、 外部类能够间接拜访外部类中的成员,包含公有成员
2、 外部类要拜访外部类的成员,必须要建设外部类的对象
3、 在成员地位的外部类是成员外部类
4、 在部分地位的外部类是部分外部类
3.1成员外部类
//测试 外部类public class Test1_Inner { public static void main(String[] args) { //创立外部类的对象的语法:外部类对象.外部类对象 Outer.Inner in = new Outer().new Inner(); in.in(); System.out.println(in.age); }}//成员外部类class Outer{//外部类 String name = "jack"; public void out() { //3,外部类 拜访外部类的 成员--不能够间接用,须要创立外部类对象 new Inner().in(); System.out.println("out()..."); } //1,外部类--能够看做是外部类的一个非凡成员,和其余成员是同级关系 class Inner{ int age = 20; public void in() { //2,外部类 能够间接 拜访外部类 的成员--能够 System.out.println(name); System.out.println("in()..."); } }}
被private润饰
package cn.tedu.inner;//测试外部类被private润饰public class Test5_InnerClass2 { public static void main(String[] args) {//创立外部类对象,并执行show()// Outer2.Inner2 oi = new Outer2().new Inner2();//报错,Inner2曾经被private了//3,测试被private的外部类的资源是否执行! new Outer2().test(); }}class Outer2{ //2,如果想要拜访private的外部类,能够拜访外部类提供的对应办法 public void test() { //拜访外部类办法 new Inner2().show(); }//地位在类里办法外--成员外部类//1,外部类能够被private润饰,然而外界无奈间接创建对象了! private class Inner2{ public void show() { System.out.println("Inner2.show()"); } }}
被static润饰
package cn.tedu.inner;//测试外部类被static润饰public class Test6_InnerClass3 { public static void main(String[] args) { // 创立外部类对象测试show() // Outer3.Inner3 oi = new Outer3().new Inner3();//报错,起因是Inner3是动态的外部类 Outer3.Inner3 oi = new Outer3.Inner3();//Outer3.Inner3通过类名.调用类中的动态资源 oi.show(); Outer3.Inner3.show2();//调用动态外部类里的静态方法 }}class Outer3{ //1,外部类被static润饰--随着类的加载而加载,会造成内存资源节约,并不罕用! static class Inner3{ public void show() { System.out.println("Inner3.show()"); } static public void show2() { System.out.println("Inner3.show2()"); } }}
3.2 匿名外部类
//测试 匿名外部类//总结://接口能够间接new对象,要配合匿名外部类应用(在内部类里重写了办法public class Test2_Inner { public static void main(String[] args) { //优化计划:间接new接口,要配合匿名外部类应用(在内部类里重写了办法)--占内存少,不必实现类 Inner in = new Inner() { @Override public void save() { System.out.println("数据保留胜利"); } @Override public void delete(int id) { System.out.println("数据删除胜利,id是:"+id); } };// }.save();//调用指定办法// }.delete(5);//留神:调用指定办法--匿名对象一次只执行一个工作,只能2选1 in.save(); in.delete(10); }}interface Inner{ //简写模式 void save(); void delete(int id);}
4socket
4.1ServerSocket服务器端
创建对象:
ServerSocket(int port) 创立绑定到特定端口的服务器套接字。
罕用办法:
Socket accept() 侦听并承受到此套接字的连贯。 void close() 敞开此套接字。
测试:
//socket通信的服务器端public class Test1_Server { public static void main(String[] args) throws IOException { //1,开始服务器--端口号0~65535 //在指定的8887端口号处,期待客户端的连贯 ServerSocket server = new ServerSocket(8887); System.out.println("服务器已开启。。。"); //2,接管客户端连贯申请,并建设通信通道Socket Socket accept = server.accept(); System.out.println("接管一个客户端的申请。。"); //3,读取客户端发来的数据 InputStream in = accept.getInputStream(); //读到的数据默认是int,转成字符类型 for(int i = 0;i<5;i++) { char b = (char)in.read(); System.out.print(b); } //4,服务器发送数据 OutputStream out = accept.getOutputStream(); String output = new Scanner(System.in).nextLine(); out.write(output.getBytes()); System.out.println("发送胜利"); // }}
4.2socket客户端
创建对象:
Socket(String host, int port) 创立一个流套接字并将其连贯到指定主机上的指定端口号。
罕用办法:
InputStream getInputStream() 返回此套接字的输出流。 OutputStream getOutputStream() 返回此套接字的输入流。
测试:
//socket通信的客户端public class Test2_Client { static Socket socket =null; public static void main(String[] args) throws IOException { method2();//读取 method();//写出 //1,连贯指定的服务器 //本机ip--127.0.0.1 //理论工作中,要写服务器的真是ip socket = new Socket("172.199.26.30",8888); System.out.println("客户端与服务器连贯胜利"); } private static void method2() throws IOException { //3,读取服务器的数据 InputStream in = socket.getInputStream(); for(int i = 0;i<5;i++) { char b = (char)in.read(); System.out.print(b); } } private static void method() throws IOException { //2,给服务器写出数据 OutputStream out = socket.getOutputStream(); System.out.println("请输出发给服务器的数据"); String input = new Scanner(System.in).nextLine(); out.write(input.getBytes()); System.out.println("发送胜利"); out.flush(); }}
4.3BufferedReader
//服务器端//读一行:BufferedReader()--readline()//写一行:PrintWrite()--println()public class Test3_BufferedReader { public static void main(String[] args) throws IOException { //1,开启服务器,凋谢端口 ServerSocket server = new ServerSocket(8886); System.out.println("服务器已开启"); //2,接管客户端申请,建设连贯通道Socket Socket accept = server.accept(); System.out.println("Sosket通道已建设");// rwmethod();//边读边写 } public static void rwmethod() throws IOException { //1,创立读取对象 BufferedReader br = new BufferedReader(new FileReader("./a.txt")); PrintWriter pw = new PrintWriter(new FileWriter("./b.txt")); String line =""; while((line = br.readLine())!=null) {//只有有数据,就始终读,没数据就返回null pw.println(line); } br.close(); pw.close(); }/** * 用来写一行:PW * @param path 要把文档写在那个文件里去 * @param date 写的内容 * @throws IOException */ public static void writeline(String path,String date) throws IOException { //1,创建对象 PrintWriter pw = new PrintWriter(new FileWriter(path)); //2,写出一行数据 pw.println(date); //3,开释资源 pw.close(); }/** * 用来读一行 * @throws IOException */ public static void readline(String path) throws IOException { //读一行:BufferedReader BufferedReader br = new BufferedReader(new FileReader(path)); //读不到数据时,readline()返回null// String line = br.readLine(); String line ="";//创立变量,记录读取到的一行数据 while(line !=null) {//只有有数据,就始终读,没数据就返回null line = br.readLine();//一行一行读取数据 System.out.println("line="+line); } br.close(); }}
4.4BufferedSocket
//客户端public class Test3_BufferedSocket { public static void main(String[] args) throws IOException { //1,连贯指定的服务器--输出服务器IP地址和端口号 //本机ip--127.0.0.1 Socket socket = new Socket("127.0.0.1",8886); System.out.println("客户端连贯胜利"); Test3_BufferedReader.writeline("./b.txt","over"); Test3_BufferedReader.readline("./a.txt"); }}
5JDK新个性
JDK1.5-- 可变长参数(Varargs)method(int a,int...b)
JDK1.7--try--with--resources:主动敞开流
JDK1.8--Lambda表达式
应用Lambda语法来代替 匿名外部类,代码不仅简洁,而且还可读语法:(参数列表) -> {办法体} --接口能够存在一般办法,然而须要用default/static润饰。