JAVA中的反射

反射的原理

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

使用反射首先需要得到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());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值