JAVA中的反射

来源:互联网 发布:端口号范围作用 编辑:程序博客网 时间:2024/05/21 11:17

反射的原理

应用在一些通用性比较高的代码中后面学到的框架,大多数都是使用反射来实现的在框架开发中,都是基于配置文件开发在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行

使用反射首先需要得到Class类

三种方式获取Class类:类名.class                   对象.getClass()                   使用Class.forName("路径")类中内容分别可通过不同的类来表示:属性--Field构造方法--Constructor普通方法--Method
//获取Class类的三种方式        Class clazz1 = Person.class;        Class clazz2 = new Person().getClass();        Class clazz3 = Class.forName("TestReflect.Person");

使用反射操作构造方法(不使用new新建类的实例)

//实例化类,不使用new 无参构造函数    @Test    public void test1() throws Exception{        //得到Class        Class c1 = Class.forName("TestReflect.Person");        //得到Person类的实例        Person p = (Person)c1.newInstance();        p.setName("lisi");    }    //实例化类,不使用new 有参构造函数    @Test    public void test2() throws Exception {        //得到Class        Class c1 = Class.forName("TestReflect.Person");        //传递的是有参数构造方法里面参数的类型,类型使用class形式        Constructor cs = c1.getConstructor(String.class);        //通过有参数的构造方法设置值,,并创立对象        Person p = (Person)cs.newInstance("zhangsan");    }

使用反射操作类里面的属性

    得到对象Class c3 = Class.forName("TestReflect.Person");    Person p1 = (Person)c3.newInstance();    得到属性Field f1 = c3.getDeclaredField("name");    允许操作私有属性f1.setAccessible(true);
    //操作name属性    @Test    public void test3() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {        Class c3 = Class.forName("TestReflect.Person");        Person p1 = (Person)c3.newInstance();        //c3.getDeclaredFields();--得到所有属性        Field f1 = c3.getDeclaredField("name");        //可以操作私有属性        f1.setAccessible(true);        f1.set(p1,"wangwu");        System.out.println(f1.get(p1));    }

使用反射操作普通方法

使用Method类来操作普通方法获得方法:Method m1 = c4.getDeclaredMethod("setName", String.class);执行方法:m1.invoke(p1,"haha");操作私有方法:m1.setAccessible(true);操作静态方法:m1.invoke(null,"变量");
 //操作普通方法    @Test    public void test4() throws Exception {        Class c4 = Class.forName("TestReflect.Person");        //得到Person实例        Person p1 = (Person)c4.newInstance();        //得到普通方法        //c4.getDeclaredMethods()得到全部普通方法        Method m1 = c4.getDeclaredMethod("setName", String.class);        //方法后面变量为函数参数类型        Method m2 = c4.getDeclaredMethod("ttt", String.class, int.class);        //让setName方法执行,执行设置值        m1.invoke(p1,"haha");        System.out.println(p1.getName());    }
原创粉丝点击