java反射和注解

反射

获取class对象的三种方法

①:Class.forName("全类名");

②:类名.class

③:对象.getclass();

代码样例

java 复制代码
package com.ithema;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        //第一种方式
        //最为常用
        Class aClass1 = Class.forName("com.ithema.student");
        System.out.println(aClass1);

        //第二种方式
        //一般更多作为参数传递传递
        Class aClass2 = student.class;
        System.out.println(aClass2);

        //第三种方式
        //当有了这个类的对象时才可以使用
        student s=new student();
        Class aClass3 = s.getClass();
        System.out.println(aClass3);

    }
}

利用反射获取构造方法

代码样例

java 复制代码
package ithema;

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

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1.获取字节码文件对象
        Class aClass1 = Class.forName("ithema.student");
        
        //2.获取构造方法
        //获取public修饰的构造方法
//        Constructor[] cons = aClass1.getConstructors();
//        for (Constructor con : cons) {
//            System.out.println(con);
//        }

        //获取所有的构造方法
//        Constructor[] cons2 = aClass1.getDeclaredConstructors();
//        for (Constructor con : cons2) {
//            System.out.println(con);
//        }

        //获取单个的构造方法
//        Constructor con1 = aClass1.getDeclaredConstructor();
//        System.out.println(con1);
//
//        Constructor con2 = aClass1.getDeclaredConstructor(String.class);
//        System.out.println(con2);
//
//        Constructor con3 = aClass1.getDeclaredConstructor(int.class);
//        System.out.println(con3);

        Constructor con4 = aClass1.getDeclaredConstructor(String.class, int.class);
        System.out.println(con4);

        //获得权限修饰符
        int modifiers = con4.getModifiers();
        System.out.println(modifiers);

        //得到构造方法所有的参数类型
        Parameter[] parameters = con4.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        //通过反射得到的构造方法创建对象

        //暴力反射:临时取消权限校验
        con4.setAccessible(true);
        student stu = (student) con4.newInstance("张三", 23);
        System.out.println(stu);
    }
}

里面的学生类对象代码:

java 复制代码
package ithema;

public class student {
    String name;
    int age;

    public student() {
    }

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

    protected student(int age) {
        this.age = age;
    }

    private student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

利用反射获取成员变量

代码样例

java 复制代码
package adsads;

import java.lang.reflect.Field;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        //第一种方式
        //最为常用
        Class aClass1 = Class.forName("adsads.student");

        //获取所有成员变量
//        Field[] fields = aClass1.getDeclaredFields();
//        for (Field field : fields) {
//            System.out.println(field);
//        }

        //获取单个成员变量
        Field name = aClass1.getDeclaredField("name");
        System.out.println(name);

        //获取权限修饰符
        int modifiers = name.getModifiers();
        System.out.println(modifiers);

        //获取成员变量的名字
        String n=name.getName();
        System.out.println(n);

        //获取成员变量的数据类型
        Class<?> type = name.getType();
        System.out.println(type);

        //获取成员变量记录的值
        student s=new student("张三",32,"男");
        name.setAccessible(true);
        String value =(String) name.get(s);
        System.out.println(value);
        //修改对象里面记录的值
        name.set(s,"list");
        System.out.println(s);
    }
}

里面的学生类 对象代码:

java 复制代码
package adsads;

public class student {
    private String name;
    private int age;

    public String gender;

    public student() {
    }

    public student(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

利用反射获取成员方法

java 复制代码
package ads;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //第一种方式
        //最为常用
        Class aClass1 = Class.forName("ads.student");

        //获取里面所有的方法对象(包含父类公共的)
//        Method[] methods = aClass1.getMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }

        //获取里面所有的方法对象(不包含父类,但是可以获取本类中私有的)
//        Method[] methods1 = aClass1.getDeclaredMethods();
//        for (Method method : methods1) {
//            System.out.println(method);
//        }

        //获取指定的单一方法
        Method m = aClass1.getDeclaredMethod("eat", String.class);
        System.out.println(m);

        //获取方法的修饰符
        int modifiers = m.getModifiers();
        System.out.println(modifiers);

        //获取方法的名字
        String name = m.getName();
        System.out.println(name);

        //获取方法的形参
        Parameter[] parameters = m.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        //获取方法抛出的异常
        Class[] exceptionTypes = m.getExceptionTypes();
        for (Class exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        //方法运行
        student s=new student();
        m.setAccessible(true);
        //参数1:s 表示方法的调用者
        //参数2:汉堡包 表示调用方法的时候传递的实际参数
        m.invoke(s,"汉堡包");
    }
}

里面的学生类 对象代码:

java 复制代码
package ads;

import java.io.IOException;

public class student {
    private String name;
    private int age;

    public student() {
    }

    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public void sleep(){
        System.out.println("睡觉");
    }
    private void eat(String something)throws IOException ,NullPointerException{
        System.out.println("在吃"+something);
    }
}

反射的作用

获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑

结合配置文件,动态的创建对象并调用方法

注解

就是Java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。

注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。

自定义注解

注解的原理

元注解

修饰注解的注解

注解的解析

什么是注解的解析?

就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来

如何解析注解?

指导思想:要解析谁上面的注解,就应该先拿到谁。

比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解

比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析

其上面的注解。

Class、Method、Field,Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力。

类上面注解的解析

方法上面的解析

注解的作用:如可以用自定义注解来进行实现执行加了注解的方法,不执行不加注解的方法

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说8 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json