Java注解和反射

注解 Annotation :

不仅让人看,还是让机器看的

格式:

@注释名 还可以添加参数

Java内置注解:

• @Override:只用于修辞方法, 重写超类中另一个方法的声明。
• @Deprecated: 可以修辞方法、属性、类,表示不鼓励程序员使用这样的元素。
• @SuppressWarnings ():需要传入一个参数, 用来抑制编译时的警告信息。

Java元注解:

@Target():描述注解zzzzzzzzzzzz的使用范围(使用ElementTzype.可以获取其参数)
@Retention(): 表示需要在什么级别保存该注释信息,用于描述注解的生命周期
SOURCE(源码时有用) < CLASS(编译时有用) < RUNTIME(运行时有用,一般自定义时使用这个)(使用RetentionPoicy.可以获取参数)
@Documented:说明该注解将被包含在JavaDoc中
@Inherited:说明子类可以继承父类中的该注解

自定义注解

使用@interface 自定义注解

自定义注解的参数
注解的参数: 参数类型+参数名()

String name() default "";
定义一个参数名为name参数类型为String,并且可以有默认值

Public class Test{
	@MyAnnotation(age=18,name="hhy")
		Public void test(){
}
}
/**
*定义一个注解
*只有一个参数的情况下建议使用value作为参数值
*/
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
	String name() default "";
	Int age();
	intid() default -1;
}

反射 Reflection

动态语言与静态语言
在这里插入图片描述
在这里插入图片描述

获取的class对象是根据定义的类生成的, 即使new同一个类的的不同的对象,他的class对象还是相同的
获取Class的方式

  1. Student.getClass()
  2. Class.forname(“url”) //url:类的路径
Java类加载过程

在这里插入图片描述
将类加载在到内存中,生成这个类的class对象,储存到堆中,
虚拟机启动时,Main类的方法就被加载
其中static会在主类加载前提取出来,按从上到下的顺序执行。

class的方法

        // 获得类的包名+类名
        c1.getName();
        // 获得类名
        c1.getSimpleName();
 
        //获取类的所有public属性
        c1.getFields();
        //获取类的所有属性
        c1.getDeclaredFields();
        //通过名称获取累的属性
        c1.getDeclaredField("name");
 
        // 获取类的所有公开方法,包括继承的父类
        c1.getMethods();
        // 获取类的自身所有方法
        c1.getDeclaredMethods();
        // 通过方法名获取类的方法, 后面的参数为方法的参数类型的class,如果无则是null, 避免因为重载等,导致方法名重复
        c1.getDeclaredMethod("getName", null);
        c1.getDeclaredMethod("setName", String.class);
 
        // 获取本所有公开的构造方法
        c1.getConstructors();
        // 获取本所有的构造方法
        c1.getDeclaredConstructors();
        // 获取指定的构造方法
        c1.getDeclaredConstructor(int.class, String.class);
 

通过反射动态创建对象、方法、属性

	// 通过反射动态创建对象
	 
	// 调用无参构造器生成的对象
	Student student = (Student) c1.newInstance();
	 
	// 通过构造器创建对象
	Constructor constructor = c1.getDeclaredConstructor(int.class, String.class);
	Student student1 = (Student) constructor.newInstance(1,"hhy");
	System.out.println(student1);
	 
	// 通过反射动态调用方法
	Method setName = c1.getDeclaredMethod("setName", String.class);
	// invoke方法 : 激活  传进一个对象, 和一个参数数组
	setName.invoke(student1, "hhy2");
	System.out.println(student1);
	 
	// 通过反射操作属性
	 
	Field name = c1.getDeclaredField("name");
	// 关闭权限检测, 就能都改变私有属性的值
	name.setAccessible(true);
	name.set(student1, "hhy3");
	System.out.println(student1);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值