反射

 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];
    }

 

posted on 2017-02-20 22:48  Bean_love  阅读(133)  评论(0编辑  收藏  举报

导航