java反射

Posted 等你的夏天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射相关的知识,希望对你有一定的参考价值。

在java程序运行状态中,对于任意一个类,可以获取其所有的属性和方法,对于任意一个对象可以动态的调用其方法获取其属性。我们称这种特性为java反射。

应用:

在程序运行过程中,动态实现以下操作:

1)通过反射创建对象

     a. Class.newInstance()

     b. Construction.newInstance()

        //通过反射创建对象
        //1、通过newInstance创建对象,调用无参构造
        Student student=studentClass.newInstance();
        //2、通过构造器创建对象
        Constructor<Student> constructor = studentClass.getDeclaredConstructor();
        //设置是否允许访问,当private方法设置为true后,可以直接调用
        constructor.setAccessible(true);
        //通过构造器调用对象
        Student student1 = constructor.newInstance();
        Student student2 = constructor.newInstance();
        System.out.println(student1==student2);//false

2)通过反射获取对象的类型,属性,方法,构造

 /**
     * 演示获取类的各种信息
     */
    public static void getClassInfo() throws NoSuchFieldException {
        Class<Student> studentClass = Student.class;
        //获取类上的注解
        Annotation[] annotations=studentClass.getAnnotations();
        //根据名称获取单个属性
        Field name=studentClass.getField("name");
        name.setAccessible(true);
        LogData annotation = name.getAnnotation(LogData.class);
        Field[] fields = studentClass.getFields();//获取类中的public属性
        Field[] declaredFields = studentClass.getDeclaredFields();//获取类中定义的所有属性
        //获取类的方法
        Method[] methods = studentClass.getMethods();//获取类中的public的方法(包含父类方法)
        Method[] declaredMethods = studentClass.getDeclaredMethods();//获取类中定义的所有方法
        //获取实现的接口
        Class<?>[] interfaces = studentClass.getInterfaces();
        //获取类的父类
        Class<? super Student> superclass = studentClass.getSuperclass();
        //包含包名的类名
        String name1 = studentClass.getName();
        //不包含包名的类名
        String simpleName = studentClass.getSimpleName();
    }

3)动态调用对象的方法,获取对象的属性

4)获取方法或属性上的注解信息

 

反射中涉及到的常用类

1)    Class类:用来描述类信息的类

2)    Method类:用来描述方法的类

3)    Field类:用来描述属性的类

4)    Construction类:用来描述构造方法

 

获取Class对象的方式

1) 类名.class

2) 对象.getClass();

3) Class.forName(“类的全路径”)

        //获取class对象,一个类只有一个Class对象
        Class<Student> studentClass=Student.class;
        Class<? extends Student> aClass=new Student().getClass();
        Class<?> aClass1=Class.forName("entity.Student");
        System.out.println(studentClass==aClass);//true
        System.out.println(studentClass==aClass1);//true

 

以上是关于java反射的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

反射机制入门

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

OpenGL片段着色器不照亮场景