局域网怎么建设网站,外贸自建站有哪些,安徽省建筑信息平台,青岛快速网站排名一#xff0c;注解
1.什么是注解#xff1a;
Annotation是从jdk5.0开始引入的新技术作用#xff1a; 不是程序本身#xff0c;可以对程序作出解释可以被其他程序读取格式#xff1a; 以注释名在代码中存在#xff0c;还可以添加一些参数值SuppressWarnings(value…一注解
1.什么是注解
Annotation是从jdk5.0开始引入的新技术作用 不是程序本身可以对程序作出解释可以被其他程序读取格式 以注释名在代码中存在还可以添加一些参数值SuppressWarnings(valueunchecked)在哪里使用 在packageclassmethodfield等上面使用相当于给他们天界额外的辅助此信息我们可以通过反射机制编程实现对这些元数据的访问
2.内置注解
Override:此注解适用于修饰方法表示一个方法声明打算重写超类中的另一个方法声明Deprecated:可以修饰方法属性类表示不鼓励程序员使用这样的元素通常是因为它很危险或者存在更好的选择SuppressWarnings:用来抑制编译时的警告信息与前两个不同需要我们添加一个参数才能够正常使用这些参数都是已经定义好了我们选择性使用即可 SuppressWarnings(all)SuppressWarnings(unchecked)SuppressWarnings(value{unchecked,deprecation})
3.元注解
元注解的作用就是负责注解其他注解java定义了四个标准的meta-annotation类型他们被用来对其他注解类型做说明这些类型和他们所支持的类在java.lang.annotation包中可以找到 Target:用于描述注解的使用范围即注解可以使用在什么地方 Target(value{ElementType.METHOD,.....})Retention表示需要在什么级别保存该注释信息用于描述主角的生命周期,表示我们的注解在什么时候还有效 SOURCECLASSRUNTIMERetentionvalueRetentionPolicy.RUNTIMEDocumented说明该注解将被包含在Javadoc中Inherited说明子类可以继承父类中的该注解
4.自定义注解
使用interface自定义注解自动继承了java.lang.annotation.Annotation接口分析 interface用来声明一个注解格式publicinterface注解名{定义内容}其中的每一个方法实际上是声明了一个配置参数方法的名称就是参数的名称返回值类型就是参数的类型返回值只能是基本类型Class,String,enum可以通过default来声明参数的默认值如果只有一个参数成员一般参数名为value注解必须要有值我们定义注解元素时经常使用空字符串0作为默认值 public class Test01 {//注解可以显示赋值如果没有默认值我们就必须给注解赋值MyAnnotaion(age 19)public void test() {}MyAnnotaion2(小俊)public void test02(){}
}
Target({ElementType.TYPE, ElementType.METHOD})
Retention(RetentionPolicy.RUNTIME)
interface MyAnnotaion {//注解的参数参数类型参数名;String name() default ;int age();int id() default -1;//如果默认值为-1代表不存在、String[] schools() default {西部开源, 工商大学};
}
Target({ElementType.TYPE, ElementType.METHOD})
Retention(RetentionPolicy.RUNTIME)
interface MyAnnotaion2 {//如果只有一个参数建议使用value作为参数名这样在使用注解的时候就可以省略value直接赋值String value();
}
二.反射机制
1.静态 VS 动态语言
动态语言Object-C, C#,JavaScript, PHP, Python 可以在运行的时候可以根据某些条件改变自身结构静态语言Java ,C, C java不是动态语言但可称为准动态语言因为我们可以利用反射机制获得类似动态语言的特性可以是编程更为灵活
2.Java Reflection
反射是java被视为动态语言的关键反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息并且能直接操作任意对象的内部属性及方法 Class c Class.forName(java.lang.String)加载完类之后在堆内存的方法区就会产生一个Class类型的对象一个类只有一个Class对象这个对象就包含了完整的类的结构信息我们可以通过这个对象看到类的结构这个对象就像一面镜子透过这个镜子看到类的结构所以我们称之为反射正常获取对象的方式和反射获取对象的方式是反着来的
3.优缺点
优点 可以实现动态创建对象和编译体现很大灵活性缺点 对性能有影响使用反射基本上是一种解释操作我们可以告诉JVM我们希望做什么并且让他满足我们的需求但是这类操作总是慢于直接执行相同的操作
4.主要API
java.lang.Class代表一个类java.lang.reflect,Method:代表类的方法java.lang.reflect.Field:代表类的成员变量java.lang.reflect.Constructor代表类的构造器
5.Class类对象照镜子后可以得到的信息
Class本身也是一个类Class对象只能由系统建立对象一个加载的类在JVM中只会有一个Class实例hashcode都相同一个Class对象对应的是一个加载到JVM中的.Class文件每个类的实例都会记得自己是由哪个Class实例所生成的通过Class可以完整的得到一个类中所有被加载的结构Class类是Reflection的根源针对任何你想动态加载运行的类未有先获得相应的Class对象
6.Class类的常用方法获得class类实例的方式有哪些 //测试class类的创建方式有哪些
public class Test03 {public static void main(String[] args) throws ClassNotFoundException {Person person new Student();System.out.println(这个人是 person.name);//方式一通过对象获得Class c1 person.getClass();System.out.println(c1.hashCode());//方式二forName获得Class c2 Class.forName(com.kuang.reflection.Student);System.out.println(c2.hashCode());//方式三通过类名.class来获取Class c3 Student.class;System.out.println(c3.hashCode());//方式四基本内置类型的包装类都有一个Type属性Class c4 Integer.TYPE;System.out.println(c4);//方式5获得父类类型Class c5 c1.getSuperclass();System.out.println(c5);}
}
7.哪些类型可以有Class对象 //所有类型的class
public class Test04 {public static void main(String[] args) {Class c1 Object.class; //类Class c2 Comparable.class; //接口Class c3 String[].class;//一维数组Class c4 int[][].class;//二维数组Class c5 Override.class;//注解Class c6 ElementType.class;//枚举Class c7 Integer.class;//基本数据类型Class c8 void.class;//voidClass c9 Class.class;//classSystem.out.println(c1);System.out.println(c2);System.out.println(c3);System.out.println(c4);System.out.println(c5);System.out.println(c6);System.out.println(c7);System.out.println(c8);System.out.println(c9);//验证同一个类是不是只有一个class对象int[] a new int[10];int[] b new int[100];System.out.println(a.getClass().hashCode());System.out.println(b.getClass().hashCode());//结果是相同的说明数组只要类型名相同相同维度下不论长短class类都相同}
}8.java内存分析 堆 可以存new的对象和数组可以被线程共享栈 存放基本变量类型引用对象的变量方法区特殊的堆 可以被所有的线程共享包含了所有的class和static变量
9.类的加载过程 类的加载------------------------------------类的链接---------------------------------------类的初始化 将类的class文件读入内存 类的二进制数据 合并到jre JVM负责对类初始化加载的时候每个类都会有自己对应的class类对象链接时m0初始化,static会被合并到类构造器方法clinit()当中顺序执行10.什么时候会发生类的初始化
类的主动引用一定会发生类的初始化 当虚拟机启动先初始化main方法所在类new一个对象调用类的静态成员和静态方法使用java.lang.reflect包的方法对类进行反射调用当初始化一个类如果其父类没有被初始化则会先初始化其父类类的被动引用不会发生类的初始化 当访问一个静态域的时候只有真正声明这个域的类才会被初始化当通过子类引用父类的静态变量不会导致子类初始化通过数组定义类引用不会触发此类的初始化引用常量不会触发此类的初始化 因为常量在链接阶段就已经存入调用类的常量池了
11. 类加载器 类加载的作用 类缓存