JAVA的注解和反射

JDK: JAVA Development Kit

JRE : JAVA Runtime Environment

JVM: JAVA Virtual Machine

POJO(Plain Ordinary Java Object)简单的Java对象

 

@Override  覆盖重写

@Deprecated 说明过时的方法

@SuppressWarnings("all")需要传入参数的注解, 禁止显示警告,需要String[]类型的参数

四个元注解:

@interface定义一个注解

@Target: 注释类型适用的上下文,定义目标注解可以定义在哪一个地方。如ElementType.FIELD ElementType.METHOD ElementType.TYPE

@Retention(RUNTIME):指示带注释类型的注释将保留多长时间。如果注释类型声明中没有保留注释,则保留策略默认为 RetentionPolicy.CLASS。或者说是表示注解的有效域,一般默认的写法是RetentionPolicy.RUNTIME

@Documented:表示当前注解将要生成在对应的文档中。

@Inherited:表示子类可以继承父类

 

自定义注解的简单定义:

@Target({ElementType.TYPE,ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@interface Myannotion {

    String name() default "";//作为注解的参数,注解类型+参数名();

    //这里注解默认值设置为空,当Target参数没有默认值时,必须要显示的设置初值

    int id() default -1;//如果为-1代表不存在。

    //有默认值的可以不写,只写没有 设置初值的参数。

        //value 参数在参数赋值的时候可以直接写,不用再写value这个参数名

}

 


运行的时候创建对象可以用反射来实现,基本的创建可以New Clone

动态语言:运行的时候可以改变其结构的语言  

静态语言: 可以通过反射来实现运行时动态调节,基本的数据类型和结构都是不可变数据类型,内容存放再栈结构中。

常用的JAVA反射类:

java.lang,class

java.lang.reflect.Field

java.lang.reflect.Array 

java.lang.reflect.Method

java.lang.reflect.Constructor

 

通过反射获得String类型参数的对象:

Class.forName("");

思想:想要运行时创建新的对象,

首先要获得想要创建的类对象所对应的公共类,class。

每个类都有一个最原始的class属性。

Class类创建的几种方式:

  1. 通过对象获得:类对象. getClass()

  2. forname: Class. forName("类路径")

  3. 通过类名:类名. class

  4. 基本内置不可变数据类型的Type属性:例如Integer. TYPE

        另外继承父类的对象,可以通过 类对象名

 

//所有类型的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; //void

Class c9 = Class.class; //Class

}

获得Class只和类对象或者类的类型有关,和类对象,类变量的大小长度都没有关系!


Java内存的分析

装载:将编译好的class字节码文件内容加载到内存中,形成方法区运行时的数据结构,生成一个代表这个类的java. lang. Class对象

链接:

  1. 验证:确保字节码文件的类信息符合规范

  2. 准备: 为静态变量分配内存,或者设置初始值

  3. 解析: 常量池中的常量转化为绝对地址的过程

初始化:

  1. 执行类构造器,由clinit()方法将各种解析出的变量和赋值操作构成可以执行类文件

  2. 如果发现类的父类还未初始化则需要先触发其父类的初始化

  3. 虚拟机可以满足多线程环境下,clinit()构造类的时候正确的进行同步操作,比如单线程下多个事物调取一个资源的同步过程,虚拟机可以实现这种有条不紊的加锁和同步。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值