注解与反射学习笔记

自定义注解

使用@interface自定义注解(自动继承了java.lang.annotation.Annotation接口)

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class Annotation {
    //举例
    @MyAnnotation(name = "Lily",age = 18)
    public void test(){

    }
}

/**
 * 元注解
 * @Target 用于描述注解的使用范围
 * @Retention 表示需要在什么级别保存该注释信息,用于描述注解的生命周期(SOURCE<CLASS<RUNTIME)
 * @Document 说明该注解将被包含在javadoc中
 * @Inherited 说明子类可以继承父类的该注解
 */
@Target({ElementType.TYPE,ElementType.METHOD})//可作用在类或者方法上
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{
    //以下是的注解参数,不是方法:参数类型+参数名()
    String name() default "";
    int age();
    int id() default -1;
    String[] school() default {"西北大学","清华大学"};
}

获得Class对象

//创建Class对象的方式
public class GetClass {
    public static void main(String[] args) throws ClassNotFoundException {
        Person person = new Student();
        //方式一 通过对象获得
        Class c1 = person.getClass();
        //方式二 forname获得
        Class c2 = Class.forName("com.test.GetClass");
        //方式三 通过类名.class获得
        Class<Student> c3 = Student.class;
        //获得父类类型
        Class superclass = c1.getSuperclass();
    }
}
//父类
class Person{
    public String name;
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }

    public Person(String name) {
        this.name = name;
    }

    public Person() {
    }
}
//子类
class Student extends Person{
    public Student() {
        this.name = "学生";
    }
}

Class类的常用方法

在这里插入图片描述

类加载器

public class Test {
    public static void main(String[] args) {
        //获得系统类的加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);
        //获得扩展类加载器
        ClassLoader parent = systemClassLoader.getParent();
        System.out.println(parent);
        //获得根加载器(C/C++编写,无法获取,获取值为null)
        ClassLoader parent1 = parent.getParent();
        System.out.println(parent1);
        //测试当前类有哪个类加载器加载
        ClassLoader classLoader = Class.forName("com.test.Test").getClassLoader();
        System.out.println(classLoader);
        //获得系统加载器可加载的路径
        System.out.println(System.getProperty("java.class.path"));
    }
}

动态操作对象

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得class对象
        Class user = Class.forName("com.test.User");
        //调用了无参构造
        User user1 = (User) user.newInstance();
        //通过构造器创建对象
        Constructor constructor = user.getDeclaredConstructor(String.class);
        User user2 = (User)constructor.newInstance("ok");
        //通过反射调用对象方法
        Method method = user.getDeclaredMethod("setName", String.class);
        method.invoke(user1,"ok1");
        //通过反射操作属性,不能直接操作私有属性
        User user3 = (User) user.newInstance();
        Field field = user.getDeclaredField("name");
        field.setAccessible(true);//关闭安全检查,操作私有属性
        field.set(user3,"okokok");
        System.out.println(user3.getName());
    }
}
class User{
    private String name;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(String name) {
        this.name = name;
    }

    public User() {
    }
}

----参考b站up主:遇见狂神说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值