反射

头像
fubin
    阅读 3 分钟

    反射的介绍

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

    反射的使用

    获取Class对象的三种方式

    1.Object--->getClass
    2.任何数据类型包括基本数据类型都有一个静态的class属性
    3.通过Class类的静态方法:forName(String className)(常用)

    package com.cy;
    public class StudentTest {
        public static void main(String[] args) {
            //getClass()方式
     Student student=new Student();
            Class stuClass=student.getClass();
            System.out.println(stuClass.getName());
            //静态的class属性方式
     Class stuClass2=Student.class;
            System.out.println(stuClass2);
            System.out.println(stuClass==stuClass2);
            //3.通过Class类的静态方法:forName(String className)(常用)
     try {
                Class stuClass3=Class.forName("com.cy.Student");
                System.out.println(stuClass3);
                System.out.println(stuClass==stuClass3);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    class Student{}

    注意:在运行期间,一个类,只有一个Class对象产生
    三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法

    通过反射获取构造方法并使用

    反射所有的构造方法

    反射公有的构造函数

    通过反射获取注解的内容

    获取类注解的内容和类内部属性的注解内容???????
    先获取类的字节码文件,
    通过类的字节码文件获取类注解并取得类注解的内容
    然后通过类的字节码文件取得被注解的属性,并获取属性注解和注解的内容

    package com.cy;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import java.lang.reflect.Field;
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @interface Entity{
        String value() default "";
    }
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD,ElementType.FIELD})
    @interface ID{
        String value() default "";
    }
    @Entity("t_user")
    class user{
        @ID("uid")
        private Integer id;
    }
    public class AnnotationTests {
        public static void main(String[] args) throws NoSuchFieldException {
            //获取字节码文件
     Class<?>targetCls=user.class;
            String entityValue=user.class.getAnnotation(Entity.class).value();
            System.out.println(entityValue);
            //获取属性
     Field field=targetCls.getDeclaredField("id");
            //获取id
     ID id=field.getAnnotation(ID.class);
            //获取id的值
     String idvalue=id.value();
            System.out.println(idvalue);
        }
    }

    fubin
    10 声望0 粉丝