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值发生了更改

目录
相关文章
|
11月前
|
JSON 安全 Java
|
11月前
|
Java
java SpringAop 自定义注解 解析
java SpringAop 自定义注解 解析
|
7月前
|
Java 数据库连接 数据库
JavaEE之反射
JavaEE之反射
50 0
|
8月前
|
Java API 开发者
反射-JavaEE
反射-JavaEE
19 0
|
9月前
|
Java 数据库连接 数据库
JavaEE之反射(详解)1
JavaEE之反射(详解)1
50 0
|
9月前
|
缓存 Java
java通过反射获取加了某个注解的所有的类
java通过反射获取加了某个注解的所有的类
|
11月前
|
Java API Spring
|
存储 前端开发 Java
【Java】反射、注解、动态代理总结(一)
【Java】反射、注解、动态代理总结
【Java】反射、注解、动态代理总结(一)
|
Java 编译器 API
【Java】反射、注解、动态代理总结(二)
【Java】反射、注解、动态代理总结
|
JavaScript 前端开发 Java
【JavaSE】之注解与反射(上)
【JavaSE】之注解与反射(上)
【JavaSE】之注解与反射(上)