zoukankan      html  css  js  c++  java
  • 反射

     1、用反射的加载的类去创建实例,并实现将创建的实例去调用此类中的方法。

    String name="Com.huyanlan.javaTest.Person";
            @SuppressWarnings("rawtypes")
            Class clazz=Class.forName(name);
            Object obj=clazz.newInstance();//这是一个创建实例的方法,就是用类加载的方法进行。
            ((Person) obj).setName("Tom");

    2、简单的一些关于反射的调用类的方法,以及怎么去执行私有方法。

    public void Studenttest() throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{
            Class clazz=Class.forName("Com.huyanlan.javaTest.Student");
            Method method_1=clazz.getDeclaredMethod("method1", int.class);//""里面的名字是对象里的方法,后面则是类型的封装类。
            
            Object obj=clazz.newInstance();//创建实例
            method_1.setAccessible(true);//允许通过以下的语句去执行
            method_1.invoke((Student)obj, 3);//已经执行了这个方法。
        //    System.out.println(((Student) obj).getN());
        //    System.out.println(method_1);
        }

    3、怎么利用反射加载私有属性变量,并做相应的处理。

    public void StudentTest1() throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException{
            Class clazz=Class.forName("Com.huyanlan.javaTest.Student");
        //    System.out.println(clazz);
            Person person;
        //    System.out.println();
            Field field=clazz.getDeclaredField("Name");
            Object obj=clazz.newInstance();
        //    System.out.println(obj);
            field.setAccessible(true);
            field.set(obj, "胡焰兰");
        //    System.out.println(((Student) obj).getName());        
        }

    4、利用反射,加载注释。

    public void AnnotationTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException{
            Class clazz=Class.forName("Com.huyanlan.javaTest.Student");
            Method method=clazz.getDeclaredMethod("setGrade", int.class);
            System.out.println(method);
            Annotation annotation= method.getAnnotation(GradeValue.class);
            
            System.out.println(annotation);
            int val=30;
            if(annotation!=null){
                if(annotation instanceof GradeValue){
                    GradeValue gradeValue=(GradeValue) annotation;
                    if(val>gradeValue.max()||val<gradeValue.min()){
                        System.out.println("赋值不合法");
                    }
                }
            }
        }

    5、利用反射获得类的泛型类型。

    public static Class getReflectGeneric(Class clazz,int index){
            Type type=clazz.getGenericSuperclass();
            if(!(type instanceof ParameterizedType)){
                return Object.class;
            }
            Type[] args=((ParameterizedType)type).getActualTypeArguments();
            if(args[index]==null &&args.length<0){
                return Object.class;
            }
            
            //System.out.println(type);
            return (Class) args[index];
        }
  • 相关阅读:
    《JavaWeb从入门到改行》JSP+EL+JSTL大杂烩汤
    Linux下进程线程,Nignx与php-fpm的进程线程方式
    solr全文检索实现原理
    LSM树以及在hbase中的应用
    MySQL的MyISAM与InnoDB的索引方式
    MySQL的innoDB存储引擎的运作方式,数据结构等
    Redis作缓存
    Redis的几点积累
    Redis数据库各种数据结构的内部实现。
    正则表达式!!!
  • 原文地址:https://www.cnblogs.com/baiyangLI/p/6421965.html
Copyright © 2011-2022 走看看