反射机制:获取成员和方法

一,关于获取成员
在我们正常获取成员的时候的形式是这样的:

 Person p = new Person();
 p.age;

则反射机制为:

1.先定义类名
2.然后获取本类的方法,利用getDeclaredField(“age”)
3.再实现类名
4.将实现的类名进行对成员的获取函数get(obj)。如果是需要初始化成员,则需要使用函数set(obj,14);//初始化值
5。如果需要访问私有成员,则需要f.setAccessible(true);//是否通过访问权限

public static void getFileDemo() throws Exception {
        Class clazz = Class.forName("day26.Person");
        Field f = null;

        f = clazz.getDeclaredField("age");//获取本类,包含私有  //clazz.getField("age")//只获取共有

        //对私有字段的访问取消权限
        f.setAccessible(true);

        Object obj = clazz.newInstance();
        Object o = f.get(obj);//get()为获取值
        System.out.println(o);

        //定义值
        f.set(obj, 14);//定义值
        Object obj1 = f.get(obj);

        System.out.println(obj1 );
    }

二,获取方法:

a,正常形式获取方法:

Person p = new Person();
p.show();

反射机制为:

获取函数名时:
1.获取类名
2.调用getMethods();//获取此类的全部public方法,包括父类
3.再调用getDeclaredMethods();//获取这个类中的全部方法,只是这个类,包括私有

private static void getMethodDemo() throws Exception {
        //获取所有公共函数
        Class clazz = Class.forName("day26.Person");

        Method[] method = clazz.getMethods();//获取的都是共有的方法 包括父类的方法
         method = clazz.getDeclaredMethods();//只能获取本类中所有的方法,包括私有
        for(Method me : method) {
            System.out.println(me);
        }
    }

b,调用方法。

获取空参函数
1.寻找类名
2.取空参函数getMethod(” “,null);
3.实现这个类obj
4.实现这个方法需要用invoke(obj,null);

如果需要调用无参数,但是要实现参数的,则先需要调用构造函数。

代码:

Class clazz = Class.forName("day26.Person");

        Method method = clazz.getMethod("method", null);//获取空参的一般函数

        Object obj = clazz.newInstance();//创建对象
        method.invoke(obj, null);//调用方法
        System.out.println("==============================");
        Method method1 = clazz.getMethod("show", null);

        Constructor constructor = clazz.getConstructor(String.class,int.class);//先调用构造函数
        Object o = constructor.newInstance("xiaoming",16);
        method1.invoke(o, null);

c,调用有参数的函数:
1,获取类名
2,利用getMethod(“函数名”,参数,参数);
3,实现此类
4,实现函数invoke(obj,参数,参数);

代码:

Class clazz = Class.forName("day26.Person");
        Method method = clazz.getMethod("method_1", String.class,int.class);

        Object obj = clazz.newInstance();
        method.invoke(obj, "小强",26);

猜你喜欢

转载自blog.csdn.net/so_band/article/details/80300161
今日推荐