Java注解和反射

1. 注解

  • 内置注解

    @Override : 定义在java.lang.Override , 表示重写超类中方法的声明

    @Deprecated : 表示不希望被使用

    @SuppressWarnings : 用来抑制警告信息

    ​ 参数 : all unchecked ......

  • 元注解

    @Target : 注解的使用范围

    @Retention : 在什么地方有效

    @Documented : 将注解生成在javadoc

    @Inherited : 子类继承父类注解

  • 自定义注解 : 再说

    import java.lang.annotation.*;
    
    //去除警告
    @SuppressWarnings("all")
    @Meta
    public class MetaAnnotation {
    
        @Meta
        public void test(){
    
        }
    }
    
    //表示我们可以用在那些地方  可有多个参数
    @Target(value = {ElementType.METHOD,ElementType.TYPE})
    //表示在什么地方有效  SOURCE   CLASS   RUNTIME
    @Retention(value = RetentionPolicy.RUNTIME)
    //表示是否将注解生成在javadoc中
    @Documented
    //表示子类继承父类注解
    @Inherited
    
    //定义一个注解
    @interface Meta {
    
    }

2. 反射

含义
java.lang.Class整个字节码,一个类型,整个类
java.lang.reflect.Method字节码中的方法字节码,类中的方法
java.lang.reflect.Constructor字节码中的构造方法字节码,类中的构造方法
java.lang.reflect.Field字节码中的属性字节码,类中的成员变量(静态变量+实例变量)

1. 概述

java.lang.reflect.*;  //相关类在这个包下

​ 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

​ 对于任意一个对象,都能够调用它的任意一个方法和属性;

​ 这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

正常方式 : 引入所需要的包 --> 通过new实例化 -->取得实例化对象

反射方式 : 实例化对象 -->getClass()方法 --> 得到完整的 '包类'名称

得到类名的几种方法 :

//1. getclass()
    Student person = new Student();
    Class c1 = person.getClass();

//2. 类名.class;
    Class temp = Student.class; 
    //得到父类
    Class superclass = c1.getSuperclass(); //上方的c1

//3. ForName("包+类")

2. ForName

Class aclass = Class.forName("com.reflection.Student");

//无参构造方法
Object o1 = aClass.newInstance();

//有参构造方法  有几个参数 getConstructor()里写几个
Constructor constructor = aclass.getConstructor(String.class, String.class); Object o1 = constructor.newInstance("Student", "ceshi");

//获取共有构造方法 getConstructors()
Constructor[] privateCon = aClass.getConstructors();

//获取私有构造方法 getDeclaredConstructors()
Constructor[] privateCon2 = aClass.getDeclaredConstructors();
for (int i = 0; i < privateCon2.length; i++) {
    System.out.println(privateCon2[i]);
}
全部代码
package com.reflection;


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

public class getClassTest {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Student person = new Student();
        //getClass()
        Class c1 = person.getClass();

        //ForName("包+类")
        Class aClass = Class.forName("com.reflection.Student");
            //无参构造方法
        Object o = aClass.newInstance();
            //有参构造方法
        Constructor constructor = aClass.getConstructor(String.class, String.class);
        Object o1 = constructor.newInstance("Student", "ceshi");

            //获取私有构造方法
        Constructor[] privateCon = aClass.getConstructors();
        Constructor[] privateCon2 = aClass.getDeclaredConstructors();
        for (int i = 0; i < privateCon2.length; i++) {
//            System.out.println(privateCon2[i]);
        }
        
//        //类名.class;
        Class s1 = Student.class;
//        //得到父类
        Class superclass = c1.getSuperclass();

    }

}

class Person {
    String name;
}

class Student extends Person {
    public String sex;

    public Student() {
        super.name=" Atanycosts";
    }

    public Student(String name,String sex) {
        System.out.println("有参调用成功");
        super.name = name;
        this.sex = sex;

    }
    
    private void Test(){
        System.out.println("私有方法 , 通过.getDeclaredConstructors()方法获取");
    }

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

}

3. 反射获取成员属性

最后修改:2022 年 10 月 20 日
如果觉得我的文章对你有用,请随意赞赏