什么是反射?
简单来讲,反射就是:已知一个类,可以获取这个类的所有信息
一般情况下,根据面向对象封装原则,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