zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【转】jQuery学习
    Eclipse工作空间的缺省字符编码问题
    BS与CS的区别
    内部类的作用
    test
    Delphi制作关不掉的程序
    屏蔽指定按钮
    实现拖动无标题窗口的5种方法
    Sql服务器及数据库枚举
    Delphi调用SQL分页存储过程实例
  • 原文地址:https://www.cnblogs.com/expiator/p/8340948.html
Copyright © 2011-2022 走看看