Java中反射的简单使用

2018-11-30  本文已影响0人  王魔王

1、获取Class对象

获取Class对象有三种方式,如下:

        //获取Class对象
        Class<Person> personClass = Person.class;
          Person personFirst = new Person();
        Class aClass = personFirst.getClass();
        //要使用类的全路径类名
        Class person = Class.forName("com.bawie.jingba.Person");

2、获取属性

        //获取属性
        //获取所有的属性(只能获取public的,包括父类的)
        Field[] fields = personClass.getFields();
        //获取某个属性(只能获取public的,不包括父类的)
        Field nikeName = personClass.getField("nikeName");
        
        //获取所有属性(获取所有声明出的,包括私有的,不包括父类的)
        Field[] declaredFields = personClass.getDeclaredFields();

        //可以获取私有的某个属性
        //参数解释:idNum为属性的名字
        Field idNum = personClass.getDeclaredField("idNum");
        // 更改public属性值
        nikeName.set(personFirst, "王祖贤");
        //更改私有属性值
        idNum.setAccessible(true);
        idNum.set(personFirst, "18");

3、获取构造方法

  //获取public无参构造方法(不包括父类)
        Constructor[] constructors = personClass.getConstructors();
        //获取全部无参构造方法(包括私有的,不包括父类)
        Constructor[] declaredConstructors = personClass.getDeclaredConstructors();
        
        //只能获取public有参构造方法
        Constructor constructor = personClass.getConstructor(String.class, String.class);
        //可以获取private有参数构造方法
        Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class);

4、实利化对象

       //通过反射示例化对象
        Person person1 = personClass.newInstance();
        Person o = (Person) constructor.newInstance("林青霞", "东方不败");

5、获取方法

        //获取父类的public方法,以及自身的所有方法
        Method[] methods = personClass.getMethods();

        //获取本类中声明的方法(public和private),不包括父类的方法
        Method[] declaredMethods = personClass.getDeclaredMethods();

        //获取单个public方法
        Method eatMethod = personClass.getMethod("eat");
        Method hitMethod = personClass.getMethod("hit", int.class);

        //获取单个私有方法
        //参数解释:sleep为方法的名字
        Method sleepMethod = personClass.getDeclaredMethod("sleep");

       //调用方法
        eatMethod.invoke(personFirst);
        hitMethod.invoke(personFirst, 10);
        //调用私有方法
        sleepMethod.setAccessible(true);
        sleepMethod.invoke(personFirst);

有关调用方法的解释:
通过反射调用方法的时候,传递的第一个参数是要调用的对象,例如personFirst,而后面的参数,就根据方法本身的参数传递即可。
例如:sleep方法、eat方法、hit方法是这样定义的

 private void sleep() {
        LogUtil.d( "睡觉");
    }
 public void eat() {
        LogUtil.d( "吃饭");
    }
 public void hit(int count) {
        LogUtil.d( "打豆豆" + count + "次");
    }
上一篇下一篇

猜你喜欢

热点阅读