注解:
常见的标准注解:
重写方法:@Override
用于确保子类正确重写了父类的方法,如果方法签名不匹配,编译器会报错。
标记已过时的方法:@Deprecated
标记不推荐使用的方法/类,调用时会有编译警告。
抑制编译器警告:@SuppressWarnings()
- 未经检查的警告,由字符串
"unchecked"
指定。 - 已废弃的警告,由字符串
"deprecation"
指定。 - 移除警告,由字符串
"removal"
指定。 - 预览警告,由字符串
"preview"
指定。
例子:
@SuppressWarnings("unchecked") // 忽略泛型警告
@SuppressWarnings("all")全部警告都消失
元注解(用于定义注解的注解):
@Retention | 指定注解的生命周期 |
@Target | 指定注解可以使用的位置 |
@Documented | 让注解包含在 Javadoc 文档中 |
@Inherited | 允许子类继承父类的注解 |
@Target(例子):
自定义注解:
例子:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
public class custom {
@Myannotation01(name = "cx")
public static void main(String[] args) {
}
}
@Target(value = METHOD)//作用范围在方法
@Retention(RetentionPolicy.RUNTIME)//生命周期是运行时
@interface Myannotation01{
String name() ;//没有default默认,则在调用该注解时需要赋值
int age() default 18;//有,不需要赋值
String id() default "";
}
反射:
获取Class的作用:
主要是获取信息
得到Class几种方式:
//通过对象获得class
Class c1 = personOne.getClass();
//通过forname获得
Class c2 = Class.forName("Student");//注意该括号中填写的格式是
//:包名.类名,如果在默认包里(没有package)
//就只写类名就行
//通过类名.class获得
Class c3 = Student.class;
//-----------------------------
//包装类中都有TYPE的属性,可以获取到
Class c4 = Integer.TYPE;
//获得父类的类型
Class c5 = c1.getSuperclass();
代码:
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException {
Person personOne = new Student();
System.out.println("这个人是:" + personOne.name);
//通过对象获得class
Class c1 = personOne.getClass();
System.out.println(c1);
System.out.println(c1.hashCode());
//通过forname获得
Class c2 = Class.forName("Student");//注意该括号中填写的格式是
//:包名.类名,如果在默认包里(没有package)
//就只写类名就行
System.out.println(c2);
System.out.println(c2.hashCode());
//通过类名.class获得
Class c3 = Student.class;
System.out.println(c3);
System.out.println(c3.hashCode());
//-----------------------------
//包装类中都有TYPE的属性,可以获取到
Class c4 = Integer.TYPE;
System.out.println(c4);
//获得父类的类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
}
}
class Person{
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class Student extends Person{
public Student() {
this.name = "学生";
this.age = 18;
}
}
class Teather extends Person{
public Teather() {
this.name = "老师";
this.age = 60;
}
}
结果:
访问类内部成员,进行修改,与读取
代码:
class Person{
public String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
import java.lang.reflect.Field;
public class ClassUser {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {
//获得class对象
Person person = new Person();
Class<? extends Person> c1 = person.getClass();
System.out.println(c1);//测试存在
Field name = c1.getField("name");
name.set(person,"cx");
System.out.println(name.get(person));
System.out.println(person.name);
}
}
成果:
写在最后:
后期我会继续补充的,可以点赞收藏关注,不迷路