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

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

通过反射调用普通方法:

通过反射,调用类中的方法,通过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语言访问检查

相关文章
|
10天前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
21 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
4天前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
12 1
|
8天前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
|
8天前
|
Java
让星星⭐月亮告诉你,Java NIO之Buffer详解 属性capacity/position/limit/mark 方法put(X)/get()/flip()/compact()/clear()
这段代码演示了Java NIO中`ByteBuffer`的基本操作,包括分配、写入、翻转、读取、压缩和清空缓冲区。通过示例展示了`position`、`limit`和`mark`属性的变化过程,帮助理解缓冲区的工作原理。
17 2
|
8天前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
13 2
|
8天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
14 1
|
8天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
9 1
|
12天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
19 5
|
10天前
|
存储 算法 Java
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
这篇文章是关于如何在Java中使用Graphics2D的RenderingHints方法来提高海报制作的图像质量和文字清晰度,包括抗锯齿和解决文字不清晰问题的技术详解。
17 0
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
|
6天前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
5 0