Java-反射机制

一、反射机制

定义:

在程序运行的过程中,能够动态加载类的信息

反射机制时在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意的一个对象,都能够调用它的人一一个方法和属性;这种动态获取的信息以及动态调用对象的方法,称为Java的反射机制。

反射的作用:

  • 在运行时判断一个对象所属的类

  • 在运行时构造一个类的对象

  • 在运行时判断一个类所具有的成员变量和方法

  • 在运行时调用任意一个对象的方法

反射的原理

类的字节码文件,将xxx.java文件编译后,获得的xxx.class文件,该文件就是字节码文件,字节码文件加载到JVM中,就获得了字节码文件对象。

如何获得字节码文件对象

  • Class.forName("类的全路径描述符")
  • 类.class
  • 对象.getClass()

public class ReflectDemo {

    public static void main(String[] args) {

        Person person1 = new Person();

        Class classz1 = Person.class;
        Class classz2 = person1.getClass();
        try {

            Class classz3 = Class.forName("com.fonxian.base.reflect.Person");
            Object obj = classz3.getConstructor().newInstance();
            Person person2 = (Person) obj;
            person2.learn();
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }

}


反射机制API的使用

1、实例化Class类对象


Class<?> class1 = null;
Class<?> class2 = null;
Class<?> class3 = null;

try {
    class1 = Class.forName("reflect.TestReflect");
    System.out.println(class1.getName());
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

class2 = new TestReflect().getClass();
System.out.println(class2.getName());

class3 = TestReflect.class;
System.out.println(class3.getName());

2、获取对象父类或实现接口


Class<?> parentClass = class1.getSuperclass();
System.out.println(parentClass.getName());//若没有继承其他类,则返回的是Object类

Class<?> intes[] = class1.getInterfaces();
for(int i=0;i<intes.length;i++){
    System.out.println(intes[i].getName());
}

3、实例化类对象


//方法一
try {
    class1 = new TestReflect().getClass();
    TestReflect reflect = (TestReflect) class1.newInstance();
} catch (InstantiationException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}
//方法二
Constructor<?> cons[] = class1.getConstructors();

TestReflect tr1 = (TestReflect) cons[1].newInstance("name",20);

4、获取类的属性


Field[] field = class1.getDeclaredFields();
for(int i = 0;i < field.length;i++){
    int mo = field[i].getModifiers();
    String access = Modifier.toString(mo);//mo为1,返回public,mo为2,返回private

    Class<?> type = field[i].getType();
    System.out.println(access+" "+type.getName()+" "+field[i].getName()+";");
  //private java.lang.String name;
}
posted @ 2016-08-19 18:02  清泉白石  阅读(180)  评论(0编辑  收藏  举报