注解与反射
注解:annotation
注释:commont
作用:1、可以对程序进行注释
@Override 表示重写一个方法
@Deprecated 不推荐程序员使用
@Suppresswarnings 镇压警告
2、注解有检查和约束的作用
1.1 元注解(meta-annotation)
作用:负责注解其他注解
@Target 用于描述注解的使用范围(注解的使用哦个地方)
@Retention(表示保存级别和注解信息-> 用于描述注解的生命周期Source <Class<rRuntime)
@Documented 说明注解包含在javadoc中
@Inherited 说明子类可以继承父类中的注解
//定义一个注解
//Target 表示我们的注解可以用在哪些地方
@Target(value = {ElementType.METOD,ElementType.TYPE})
//Retention 表示我们的注解在什么地方还有效
//runtime>class>sources
@Retention(value = RetentionPolicy.RUNTIME)
//Docmented 表示是否我们的注解生成在JAVAdoc中
//Interface 子类继承父类的注解
@interface MyAnnotation{
String
}
1.2 反射机制
动态语言VS静态语言
动态语言:在运行时可以改变其运行结构,
静态语言:运行时不能改变结构的语言
反射机制 Java Reflection
是Java被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
加载万类之后,在堆内存的方法区中产生一个Clas类型的对象(一个类只能有一个Class对象),这个对象就包含了完整的类的结构信息
Class c = Class.forName(“java.lang.String”)
正常方式:引入对应包->通过new进行实例化-》获得实例化对象
反射方式:实例化对象->getClass()方法->得到完整的“包类”名称
通常反射的过程:
1、通过反射获取类的class 对象
2、一个类在内容中只有一个Class对象
3、一个类被动态加载后,类的整个结构都会被封装在class对象中
所以对于class的对象,他们存储的对象是在同一个地方,所以HashCode值是相等的
Class c = Class.forName(“com.kuang.reflection.User”)
public static void main(String[] args){
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");
//方式三:通过类名.class获得
Class c3 = Student.class;
System.out.println(c3.hashCode());
//方法四:基本内置类型的包装类都有一个Typr属性
Class c4= Interger.Type;
System.out.println(c4);
//方法五:获得父类
Class c5 = c1.getSupperclass();
System.out.println(c5);
}
所有的类型
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;void
Class c8 = Class.class;Class
类加载器的作用
类加载器的作用:将class文件字节码内容加载到内存中,并将这些静态数据换成方法区内运行时的数据结构,然后在堆中生成一个代表这个类的java。lang。Class对象,作为方法区中类数据的访问入口
类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存一段时间),不过JVM垃圾回收机制可以回收这些Class对象。
创建运行时类的对象
public class Test08{
public static void mian(String[] args){
Class c1 = Class.forName("com.kuanng.reflection.User");
//获得类的名字
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());
//获得只有public 属性
Field[] fields = c1.getFields();
fields = c1.getDeclaredFields();
for(Field field:fields){
System.out.println(field);
}
//获得指定属性的值
Field name = c1.getDeclaaredField(name:"name");
System.out.print(name);
//获得类的方法
Method[] methods = c1.getMethods();
for(Method method : methods){
System.out.println("正常的:"+method);
}
methods = c1.getDeclareMethods();
for(Method method:methods){
System.out.println("getDeclareMethods:"+method);
}
//获得构造器
Constructor[] constructor = c1.getConstructors();
for(Constructor constructor : constructors){
System.out.println(constructor);
}
constructors = c1.getDeclareConstructor();
for(Constructor constructor : constructors){
System.out. println()
}
}
}