Java学习day43-反射机制调用指定方法、指定属性

一、反射机制调用指定方法

  通过反射,调用类中的方法,通过Method类完成。步骤:

1.通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。

2.之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息。

package day19;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test1 {
    public static void main(String[] args){
    try {
        Class clazz = Class.forName("day19.Student");
        
        /**
         * 注意:下面不论是反射调用setInfo方法,还是test方法,都是调用的obj对象的方法,obj对象实际上就是student对象
         * */
        Constructor con = clazz.getConstructor();//获取无参构造
        Object obj = con.newInstance();//使用无参构造创建对象
        
        //如果想要调用一个公有的方法
        Method m = clazz.getMethod("setInfo", String.class,String.class);//得到名称叫setInfo,参数是String,String的方法
        m.invoke(obj, "张三","第一中学");//参数1是需要实例化的对象,参数2是调用当前的方法的实际参数
        
        //如果想要调用一个私有的方法
        Method m1 = clazz.getDeclaredMethod("test", String.class);//获取方法名为test,参数为一个String类型的方法
        
        m1.setAccessible(true);//解除私有的封装,下面可以强制调用私有方法
        m1.invoke(obj, "李四");
        
        //调用一个重载方法
        Method m2 = clazz.getMethod("setInfo", int.class);//setInfo的重载方法
        m2.invoke(obj, 10);//参数1是需要实例化的对象,参数2是调用当前的方法的实际参数
        
        //调用有返回值的方法
        Method m3 = clazz.getMethod("getSchool");//这是获取方法名为getSchool并且没有参数的方法
        String school =(String)m3.invoke(obj);//调用有返回值,但是没有参数的方法
        System.out.println(school);
        
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }
}

打印结果:

 

二、反射机制调用指定属性

1.在反射机制中,可以直接通过Filed类操作类中的属性,通过Field类提供的set()和get()方法就可以完成设置和取得属性内容的操作。

2.public Field getField(String name) 返回此Class对象表示的类或接口的指定public的Field。

3.public Field getDeclaredField(String name)返回此Class对象表示的类或接口的指定的Field。

4.在Field中:

  ①public Object get(Object obj)取得指定对象obj上此Field的属性内容

  ②public void set(Object obj.Object value)设置指定对象obj上此Field的属性内容

     注:在类中属性都设置为private的前提下,在使用set()和get()方法时,首先要使用Field类中的setAcessible(true)方法将需要操作的属性设置为可以被外部访问。

  ③public void setAccessible(true)访问私有属性时,让这个属性可见。

package day19;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test1 {
    public static void main(String[] args){
    try {
        Class clazz = Class.forName("day19.Student");
        //反射创建一个对象
        Constructor con = clazz.getConstructor();
        Student stu = (Student)con.newInstance();
        
        Field f = clazz.getField("school");//获取名称为school的属性
        
        f.set(stu,"第三中学");//对stu对象的school属性设置值“第三中学”
        String school = (String)f.get(stu);//获取stu对象的school属性的值
        System.out.println(school);
        
        //如果是私有属性
        Field f1 = clazz.getDeclaredField("privateField");
        
        f1.setAccessible(true);//解除私有的封装下面就可以强制调用这个属性
        f1.set(stu,"测试私有属性");
        System.out.println(f1.get(stu));
        
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }
}

打印结果:

 

posted @ 2020-04-03 11:43  苏胖胖  阅读(556)  评论(0)    收藏  举报