JavaEE之反射(详解)2

简介: JavaEE之反射(详解)2

四.反射动态方法调用

讲完反射的构造方法实例化,下面是反射动态方法调用

1.反射调用无参动态方法

1.先获取到方法对象

2.调用getMethod,第一个参数为方法名,第二个:调用这个方法要传的参数类型

因为我们是无参动态方法,所以不需要传参数类型

3.调用invoke(obj, args);方法

obj:类实例 args:参数值

因为没有参数,所以不需要传参数值

package com.YU;
import java.lang.reflect.Method;
/**
 * 反射动态方法调用
 * @author 21879
 *
 */
public class Demo3 {
  public static void main(String[] args) throws Exception {
    Class c = Student.class;
    Student stu = (Student) c.newInstance();
    /**
     * 反射调用无参方法
     * 1.先获取到方法对象
     * 2.调用getMethod,第一个参数为方法名,第二个:调用这个方法要传的参数类型
     */
    Method m1 = c.getMethod("hello");
    //obj:类实例
    Object invoke = m1.invoke(stu);
    System.out.println(invoke);
  }
}

运行结果:

加载进jvm中!

调用无参构造方法创建了一个学生对象

你好!我是null

null

这里因为没有传参数,所以是null

2.反射调用有参方法

        Class c = Student.class;
    Student stu = (Student) c.newInstance();
        /**
     * 反射调用有参方法
     */
    Method m2 = c.getMethod("hello", String.class);
    Object invoke2 = m2.invoke(stu, "大傻子");
    System.out.println(invoke2);

运行结果:

大傻子你好!我是null

null

这里传的参数是前面的name值并没有后面的sname所以后面的值为null

3.反射调用有参私有的动态方法

        Class c = Student.class;
    Student stu = (Student) c.newInstance();        
        /**
     * 反射调用有参私有的动态方法
     */
    Method m3 = c.getDeclaredMethod("add", Integer.class,Integer.class);
    m3.setAccessible(true);
    Object invoke3 = m3.invoke(stu, 1,3);
    System.out.println(invoke3);

运行结果:3

这里需要注意的是:像之前调用私有的构造方法一样,只要调用私有方法时就需要通过setAcessible打开私有方法

五.反射读写属性

1.通过反射获取对象中的所有属性

package com.YU;
import java.lang.reflect.Field;
/**
 * 反射读写属性
 * 
 * @author 21879
 *
 */
public class Demo4 {
  public static void main(String[] args) throws Exception {
    Class c1 = Student.class;
    //实例化一个对象
    Student stu = new Student("s001","YU");
    stu.age = 18;
    //获取到stu的sid和sname值-->获取到对象中的所有属性值
    Field[] filed = c1.getDeclaredFields();
    for (Field f : filed) {
      f.setAccessible(true);
      System.out.println(f.getName()+":"+f.get(stu));
    }
  }
}

运行结果:

sid:s001
sname:YU
age:18

2.通过反射修改对象属性值

package com.YU;
import java.lang.reflect.Field;
/**
 * 反射读写属性
 * 
 * @author 21879
 *
 */
public class Demo4 {
  public static void main(String[] args) throws Exception {
    Class c1 = Student.class;
    //实例化一个对象
    Student stu = new Student("s001","YU");
    stu.age = 18;
    //获取到stu的sid和sname值-->获取到对象中的所有属性值
    Field snamefield = c1.getDeclaredField("sname");
    snamefield.setAccessible(true);
    snamefield.set(stu, "Chat");
    Field[] filed = c1.getDeclaredFields();
    for (Field f : filed) {
      f.setAccessible(true);
      System.out.println(f.getName()+":"+f.get(stu));
    }
  }
}

运行结果:

sid:s001
sname:Chat
age:18

很明显,我们的sname值发生了更改

目录
相关文章
|
8月前
|
缓存 安全 Java
Java学习—注解与反射2(狂神说超详细版)
Java学习—注解与反射(狂神说超详细版)
Java学习—注解与反射2(狂神说超详细版)
|
8月前
|
Java 程序员 编译器
Java学习—注解与反射1(狂神说超详细版)
Java学习—注解与反射(狂神说超详细版)
|
8月前
|
Java 编译器 API
JavaSE基础篇:反射(二)
JavaSE基础篇:反射(二)
|
3月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
27 0
|
7月前
|
Java 关系型数据库 MySQL
一文搞懂:【javaEE】反射
一文搞懂:【javaEE】反射
26 0
|
XML 安全 Java
【javaSE】 反射与反射的使用
【javaSE】 反射与反射的使用
|
JSON 安全 Java
|
8月前
|
存储 设计模式 安全
JavaSE基础篇:反射(一)
JavaSE基础篇:反射(一)
JavaSE基础篇:反射(一)
|
Java 数据库连接 数据库
JavaEE之反射
JavaEE之反射
74 0
|
Java API 开发者
反射-JavaEE
反射-JavaEE
44 0