注解与反射(Java学习片)

注解与反射

注解: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()
        }
    }
    
}
ORM (Object Relationship Mapping) 对象关系性映射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值