本文会从以下几个方面讲起

① 反射的简单解释

② java反射的API接口 及 demo

③ 反射的优缺点、应用场景

一、什么是反射?

java反射:在程序运行中动态获取类的信息,及动态调用对象的方法,这就是java反射

二、java反射的API接口

常用API接口规律  

getXX() : 获取类本身 及父类的public属性、方法等

getDeclaredXX() :  获取类本身的所有私有保护属性、方法等

getDeclaredXX(String name) : 获取类本身的指定name的私有、保护属性、方法等(getDeclaredConstructors 较特殊, 还可以获取public)

以下demo涉及到的类先给出咯

package test.reflect;

// 父类
public abstract class Vehicle {
    
    public String superField = "父类属性";
    
    private String superPrivateField = "父类私有属性";
    
    protected String superProtectedField = "父类保护属性";

    public abstract void run();
    
    private void superPrivateMethod() {
        
    }
    
    protected void superProteMethod() {
        
    }
}

// 飞机子类
package test.reflect;

public class Airplane extends Vehicle {

    private String name;

    private int price;
    
    public String publicField;
    
    protected String protectedField;
    
    private Airplane() {
        System.out.println("Airplane 构造函数");
    }
    
    public Airplane(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public void run() {

        System.out.println("春节,坐飞机飞回家~~~");
    }
    
    protected void protectedMethod() {
        
    }
    
    private void privateMethod() {
        
    }

    public String getName() {
        return name;
    }

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

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}
// 高铁子类
package test.reflect;

public class HighSpeedTrain extends Vehicle {

    private String name;

    private int price;

    public void run() {

        System.out.println("春节,坐高铁溜回家~~~");
    }
    
    private HighSpeedTrain() {
        
    }
    
    protected HighSpeedTrain(String name) {
        
    }

    public String getName() {
        return name;
    }

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

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}

① 使用反射构建对象

1 private static void demo2() throws Exception {
2         
3         Class.forName("test.reflect.Airplane").newInstance();
4         
5         Airplane.class.newInstance();
6         
7         
8         Airplane.class.getDeclaredConstructor(new Class[]{}).newInstance(); // new Class[]{} 使用无惨构造函数
9     }

所有类都是Class对象, 获取class 有以下三种

Class.forName(包名+类名)

xx.class

xx.getClass

②  获取属性 

getFields() : 获取父子类的所有public属性

getDeclaredFields() : 获取子类的所有private\protected属性

demo如下 : 

private static void demo3() throws Exception {
        //  获取父子类的所有public属性
        Field[] fields = Airplane.class.getFields();
        for(Field f : fields) {
            print(f.getName());
        }
        // 获取子类的所有private\protected属性
        Field[] fields2 = Airplane.class.getDeclaredFields();
        for(Field f : fields2) {
            print(f.getName());
        }
        // 获取指定属性名的属性
        Field f = Airplane.class.getDeclaredField("name");
        print(f.getName());
    }


结果

 1 -------getFields-------
 2 
 3 publicField
 4 
 5 superField
 6 
 7 -------getDeclaredFields-------
 8 
 9 name
10 
11 price
12 
13 publicField
14 
15 protectedField
16 
17 --------getDeclaredField(String)------
18 
19 name
View Code

相关文章:

  • 2021-04-16
  • 2021-12-18
  • 2021-10-11
  • 2021-12-06
  • 2022-12-23
  • 2021-12-03
猜你喜欢
  • 2022-12-23
  • 2021-11-20
  • 2022-01-23
  • 2022-12-23
  • 2021-04-01
  • 2021-09-15
  • 2022-12-23
相关资源
相似解决方案