反射与内省

一 .反射

反射的概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

Class类

Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象。

获取Class对象的三种方法

1.通过对象的getClass()方法
Dog dog = new Dog("wangwang",4,"白色");
Class aClass = dog.getClass();
2.通过类.class属性
Class dogClass = Dog.class;
3.通过Class.forName方法
try {
      Class aClass1 = Class.forName("feng.Dog");
} catch (ClassNotFoundException e) {
      e.printStackTrace();
}

通过反射来实例化对象

1.通过Class对象实例化类对象,调用了默认无参的构造方法
        Class dogClass = Dog.class;
        try {
            Dog dog = dogClass.newInstance();
            dog.setName("大黄");
            System.out.println(dog);
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
2.获取所有构造方法
    public void test3(){
        Class dogClass = Dog.class;
        Constructor[] constructors = dogClass.getConstructors();
        for (int i = 0; i < constructors.length; i++) {
            System.out.println(constructors[i].getName());
            System.out.println(constructors[i].getParameterCount());
        }
        try {
            //获取一个指定的构造方法
            Constructor constructor =
                    dogClass.getConstructor(String.class, int.class,
                    String.class);
            //调用带参数的构造器来实例化对象
            Dog dog = constructor.newInstance("小白",20,"红色");
            System.out.println(dog);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

你可能感兴趣的:(反射与内省)