ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

注解(Annotation)和反射(Reflection)

2022-01-04 17:00:04  阅读:159  来源: 互联网

标签:Reflection class Annotation User 注解 c1 Class 属性


注解作用

1、可对程序作出解释,类似注释;
2、可被其他程序(编译器)读取;

注解格式

@注释名,可添加参数:@SuppressWarnings(value=“unchecked”)

内置注解

1、@Override:只适用修辞方法,表示一个方法声明打算重写超类中的另一个方法声明;
2、@Deprecated:可修饰方法、属性、类,表示不鼓励程序员适用这样的元素;
3、@SuppressWarning:用来抑制编译时的警告信息,需要添加参数(“all”、“unchecked”、“deprecation”);

元注解(负责注解其他注解)

1、@Target:描述注解的使用范围;
2、@Retention:表示需要在声明级别保存该注释的信息,用于描述注解的生命周期(SOURCE < CLASS < RUNTIME)
3、@Document:说明该注解将被包含在javadoc中;
4、@Inherited:说明子类可以继承父类中的注解;

自定义注解

使用@interface自定义,自动继承Annotation接口;
注解的参数:参数类型 + 参数名();

反射作用

反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
正常方式:引入需要的“包类”名称->通过new实例化->取得实例化对象
反射方式:实例化对象->getClass()方法->得到完整的“包类”名称

//通过反射获取类的class对象
Class c1 = Class.forName("com.kuang.reflection.User");

//一个类在内存中只有一个Class对象
//一个类被加载后,类的整个机构都会被封装在Class对象中

Class类的创建方式:
1. 通过对象获得:Class c1 = person.getClass();
2. 通过forname获得:Class c2 = Class.forName(“com.kuang.reflection.Student”);
3. 通过类名.class获得:Class s3 = Student.class;
4. 基本内置类型的包装类都有一个Type属性:Class s4 = Integer.TYPE;

类加载到内存过程:
1、加载到内存,产生一个类对应的Class对象;
2、链接,将.class代码合并到JVM的运行状态中;
3、初始化,执行类构造器< clinit >() 方法,有编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。若发现其父类没有进行初始化,则需要先触发其父类的初始化;

获得类的信息:
1、获得类的名字:
c1.getName() //获得包名 + 类名
c1.getSimpleName() //获得类名
2、获得类的属性,可获得指定属性:
c1.getFields() //只能找到public属性
c1.getDeclaredFields() //找到全部属性
3、获得类的方法:
c1.getMethods() //获得本类及其父类的全部public方法
c1.getDeclaredMethods() //获得本类的所有方法

       Class c1 = Class.forName("User");
       System.out.println(c1);

       //构造一个对象
       User user1 = (User)c1.newInstance();//本质调用类的无参构造器
       System.out.println(user1);

       //通过构造器创建对象
       Constructor constructor = c1.getDeclaredConstructor(int.class, String.class);
       User user2 = (User)constructor.newInstance(18, "mei");
       System.out.println(user2);

       //通过反射调用普通方法
       User user3 = (User)c1.newInstance();

       //通过反射获取一个方法
       Method setName = c1.getDeclaredMethod("setName", String.class);
       //invoke:激活
       //(对象,“方法的值”)
       setName.invoke(user3, "kuangsheng");
       System.out.println(user3.getName());

       //通过反射操作属性
       User user4 = (User)c1.newInstance();
       Field name = c1.getDeclaredField("name");
       name.setAccessible(true); //不能直接操作私有属性,需要关闭程序的安全检测
       name.set(user4, "kuangsheng2");
       System.out.println(user4.getName());

标签:Reflection,class,Annotation,User,注解,c1,Class,属性
来源: https://blog.csdn.net/weixin_44871778/article/details/122300353

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有