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<Car> carClass=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");   // 或者用 Class<Car> carClass=Car.class;
        Car car=(Car)carClass.newInstance();
        Field field=carClass.getDeclaredField("color");  //这里的"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);

如果没有方法参数,比如常见的getter,那么invoke()就只需要第一个对象参数就好了。

 

示例如下:

复制代码
    /**
     * 通过反射调用方法
     */
    public  static void setterByReflect() throws  Exception{
            Class<?> carClass=Class.forName("com.reflect.Car");  // 或者用 Class<Car> carClass=Car.class;
            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

 

posted on   乐之者v  阅读(138)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示