反射都可以做哪些事

本文介绍了Java反射的六项主要应用:通过反射获取构造函数并创建对象,访问及调用类的方法,操作私有属性,获取方法的参数和返回值泛型信息,以及对注解的操作。这些功能使得在运行时检查和使用类的能力大大增强。

目录

 

 

反射可以获取构造函数,创建类对象

反射可以获取类中的方法,并调用

反射可以操作私有属性

反射可以获取指定方法参数泛型信息

反射可以获取指定方法返回值泛型信息

反射可以操作注解


 

反射可以获取构造函数,创建类对象

  Class<User> clazz = (Class<User>) Class.forName( "reflection.User");
            
            //通过反射API调用构造方法,构造对象
            User user = clazz.newInstance();//其实调用的是User的无参构造方法
            Constructor<User> constructor = clazz.getDeclaredConstructor(int.class, String.class, int.class);
           User user2= constructor.newInstance(1, "张三", 30);
            System.out.println(user2.getName());


反射可以获取类中的方法,并调用

            //通过反射API调用普通方法
            User user3  = clazz.newInstance();
            Method m01 = clazz.getDeclaredMethod("setName", String.class);
            m01.invoke(user3, "李四");
            System.out.println(user3.getName());


反射可以操作私有属性

            //通过反射API操作私有属性
            User user4 = clazz.newInstance();
            Field field = clazz.getDeclaredField("name");
            //开启和禁用访问安全检查的开关,值为true,则指示反射的对象在使用时应该取消Java语言访问检查。值为false,则指示反射的对象应该实施Java访问检查
            field.setAccessible(true);
            field.set(user4, "Du");//直接通过反射机制写属性
            System.out.println(user4.getName());


反射可以获取指定方法参数泛型信息

            //获取指定方法参数泛型信息
            Method m2 = TestDemo01.class.getMethod("test01", Map.class, List.class);
           Type[] types=m2.getGenericParameterTypes();
           for(Type type : types) {
               System.out.println("#"+type);
               if(type instanceof ParameterizedType) {
                   Type[] genericTypes = ((ParameterizedType)type).getActualTypeArguments();
                   for(Type genericType : genericTypes) {
                       System.out.println("泛型类型: "+genericType);
                   }
               }
           }


反射可以获取指定方法返回值泛型信息

           //获取指定方法返回值泛型信息
           Method m03= TestDemo01.class.getMethod("test02", null);
          Type returnType= m03.getGenericReturnType();
          if(returnType instanceof ParameterizedType) {
              System.out.println("@"+ returnType);
                  Type[] types2= ((ParameterizedType)returnType).getActualTypeArguments();
                  for(Type type:types2) {
                      System.out.println("返回值的泛型类型: "+type);
                  }
          }

反射可以操作注解

String path = "annotation.Students";
        try {
            Class clazz = Class.forName(path);
            
            Annotation[] allAnnotation=clazz.getAnnotations();
            for(Annotation a:allAnnotation) {
                System.out.println(a.annotationType());
            }
            
           //通过反射获取类的指定注解内容
           Table table_annotation = (Table) clazz.getAnnotation(Table.class);
           System.out.println(table_annotation.value());
           
           //通过反射获取类的所有带注解的字段
           Field[] fields = clazz.getDeclaredFields();
           for(Field f: fields) {
               if(f.isAnnotationPresent(annotation.Field.class)) {
                   annotation.Field subField =f.getAnnotation(annotation.Field.class);
                   System.out.println("column Name " + subField.columnName());
                   System.out.println(" type " + subField.type());
                   System.out.println(" length " + subField.lenght());
               }
           }
           
           
        
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值