java反射

一、 基础

反射:在运行状态时,可以通过反射获取自身的Class信息

一般情况下,我们都是通过类实例化对象。利用反射,可以从对象得到类的信息。

核心类:Class类

二、相关方法:

先写一个简单的类来演示。 Car.java

public class Car {
    private String brand;
    private String color;
    private int maxSpeed;

  public Car(String brand, String color, int maxSpeed) {
        this.brand = brand;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }
    public Car() { } 
public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getMaxSpeed() { return maxSpeed; } public void setMaxSpeed(int maxSpeed) { this.maxSpeed = maxSpeed; } public void introduce(){ System.out.println("brand:"+brand+" color:"+color+" maxSpeed:"+maxSpeed); } }

Class 类

直接用Class:  比如 Car.Class

Class getClass() :通过对象获取Class

Class carClass=new Car().getClass();

Class<?> forName(String className):  通过类的路径实例化Class对象

T  newInstance(): 获取Class类型的实例,注意: 被实例化的类必须存在无参的构造方法,否则会报错。

示例如下:

//通过反射进行对象的实例化 
Class clazz=Class.forName("com.reflect.Car"); Car car=(Car)clazz.newInstance();

还可以通过类加载器获取Class,如下示:

 //通过类加载器获取对象
 ClassLoader  loader=Thread.currentThread().getContextClassLoader();
 Class<?> clazz=loader.loadClass("com.reflect.Car");

 Field 属性

Field getDeclaredField(String fieldName)  : Class类获取对应的属性类Field

field.setAccessible(true);    表示将属性Field设为可访问的,而非private

field.get(object)     :        表示获取object对象中的field属性的值

field.set(object,value) :    表示设置object对象中的field属性的值

注意:如果field是用private修饰的,而且没有将field设置为可访问的,那么无法对field进行操作

示例如下:

 public  void setPropertyByField( ) throws  Exception{
        Class carClass=  Class.forName("com.reflect.Car");
        Car car=(Car)carClass.newInstance();
        Field field=carClass.getDeclaredField("color");
        //将私有化的属性设为可访问
        field.setAccessible(true);
        field.set(car,"黑色");             //相当于car.color="黑色";
        System.out.println("通过反射获取属性:"+ car.getColor());
    }

Method 方法类

 Method getMethod(String methodName,Class...parameterTypes)

作用:Class类获取对应的方法类Method。

参数解释:methodName: method的名称

                  parameterTypes:method的参数类型的列表(参数顺序需按声明method时的参数列表排列)

返回:符合method名称和参数的method对象

method.invoke(Object object, Object  value);   

参数解释: object 表示对象 , value表示 方法要设置的值

作用:  通过反射调用方法。第一个参数表示对象,第二个方法表示方法参数,如果有多个方法参数,可以写成 method.invoke(Object object, Object  value,Object  value);

示例如下:

    /**
     * 通过反射调用方法
     */
    public  static void setterByReflect() throws  Exception{
            Class<?> carClass=Class.forName("com.reflect.Car");
            Car car=(Car)carClass.newInstance();
            Method method=carClass.getMethod("setColor", String.class);
            method.invoke(car,"黑色");
            System.out.println("通过反射调用方法的结果:"+car.getColor());
    }

详细Demo代码见GitHub :   https://github.com/firefoxer1992/JavaDemo/blob/master/src/main/java/com/reflect/CarReflect.java

原文地址:https://www.cnblogs.com/expiator/p/8340948.html