java中通过反射调用普通方法和操作属性的方法

导读:本篇文章讲解 java中通过反射调用普通方法和操作属性的方法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

通过反射调用普通方法:

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

步骤:

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

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

在这里插入图片描述

Object invoke(Object obj, Object … args):

Object 对应原方法的返回值:

若原方法无返回值,此时返回null

若原方法若为静态方法,此时形参Object obj可为null

若原方法形参列表为空,则Object[] args为null

若原方法声明为private,则需要在调用此invoke()方法前:
显式调用方法对象的setAccessible(true)方法,才能访问private的方法

举例:

package Collections;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class person_text {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        //获得Class对象
        Class c1 = Class.forName("Collections.person");
        //通过反射,调用普通方法
        person user3 =(person)c1.newInstance();
        //通过反射获取一个方法
        Method setName = c1.getDeclaredMethod("setName",String.class);
        setName.invoke(user3 ,"Lisa");//invoke:激活---->(对象,"方法的值")
        System.out.println(user3.getName());
    }
}

输出:

Lisa

通过反射操作属性:

package Collections;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

import static java.lang.reflect.AccessibleObject.setAccessible;
public class person_text {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, NoSuchFieldException {
        //获得Class对象
        Class c1 = Class.forName("Collections.person");
        //通过反射操作属性
        person user4 =(person)c1.newInstance();
        Field name =c1.getDeclaredField("name");
        //不能直接操作私有属性 ,我们需要关闭程序的安全检测 
        //属性或者方法.setAccessible(true);
        name.setAccessible(true);
        name.set(user4,"jason");
        System.out.println(user4.getName());
    }
}

输出:

jason

setAccessible:

Method和Field、Constructr对象都有setAccessible()方法.

setAccessible作用是启动和禁用访问安全检查的开关

参数值为true,则指示反射的对象在使用时应该取消Java语言访问检查,这样做的目的是:

1:提高反射的效率。如果代码中必须用反射,而该句代码需要频繁的被调用,那么将其参数值设置为true

2: 使得原本无法访问的私有成员也可以访问

参数值为false,则指示反射的对象应该实施Java语言访问检查

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/81403.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!