APT 系列 (一):APT 筑基之反射

反射是Java提供的一种能够在运行时分析类和对象的能力,包括获取类信息、创建对象、访问私有属性和方法等。文章通过示例代码展示了如何使用反射获取类的属性、方法、构造器、泛型信息以及注解,并给出了通过反射实现业务功能动态切换的实践案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是反射?

简单来讲,反射就是:已知一个类,可以获取这个类的所有信息

一般情况下,根据面向对象封装原则,Java实体类的属性都是私有的,我们不能获取类中的属性。但我们可以根据反射,获取私有变量、方法、构造方法,注解,泛型等等,非常的强大

注意:Google在 Android 9.0及之后对反射做了限制,被使用 @hide标记的属性和方法通过反射拿不到

反射使用

//包路径
package com.dream.aptdemo;

//自定义注解1
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface CustomAnnotation1{
   
  
}

//自定义注解2
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface CustomAnnotation2{
   
  
}

//自定义注解3
@Target(ElementType.TYPE)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface CustomAnnotation3{
   

}

//接口
interface ICar {
   
    void combine();
}

//车
@CustomAnnotation3
class Car<K,V> {
   
    private String carDesign = "设计稿";
    public String engine = "发动机";

    public void run(long kilometer) {
   
        System.out.println("Car run " + kilometer + " km");
    }
}
//==============================上面这些都是为下面这台奔驰服务的😂===========================
//奔驰
@CustomAnnotation1
@CustomAnnotation2
class Benz extends Car<String,Integer> implements ICar {
   
  
    private String carName = "奔驰";
    public String carColor = "白色";
  
    public Benz() {
   
    }

    private Benz(String carName) {
   
        this.carName = carName;
    }

    public Benz(String carName, String carColor) {
   
        this.carName = carName;
        this.carColor = carColor;
    }

    @Override
    public void combine() {
   
        System.out.println("组装一台奔驰");
    }

    private void privateMethod(String params){
   
        System.out.println("我是私有方法: " + params);
    }
}

获取类

3 种方式去获取类对象
1)Benz.class:类获取
2)benz.getClass:对象获取
3)Class.forName:静态获取

 Benz benz = new Benz();
 Class benzClass = Benz.class;
 Class benzClass1 = benz.getClass();
 Class benzClass2 = Class.forName("com.dream.aptdemo.Benz");

注意:
1、在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。
2、无论哪种途径获取类对象,都会导致静态属性被初始化,而且只会执行一次。(除了直接使用Benz.class类获取这种方式,这种方式不会导致静态属性被初始化)

获取类名

String className = benzClass.getSimpleName();
System.out.println(className);

//打印结果
Ben
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉亭下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值