初识Java反射机制——Reflection(二)

上篇文章简单给了个反射的例子,主要利用反射列出了某个类的内部类、方法和属性,接下来我们举例反射的另一些用法。

首先看一个TestReflection.java类:

package com.xingpd.code;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Scanner;

public class TestReflection {

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        String className = sc.next();
        Class clazz = Class.forName(className);
        /** 创建对象 **/
        /** 调用无参构造创建对象 **/
        Object obj = clazz.newInstance();
        System.out.println(obj);
        /** 操作属性 **/
        Field field = clazz.getDeclaredField("name");
        /** 破坏封装 **/
        field.setAccessible(true);
        System.out.println(field.get(obj));

        field.set(obj, "zhangfei");
        Object fieldValue = field.get(obj);
        System.out.println(fieldValue);
        /** 操作方法 **/

        Method method = clazz.getDeclaredMethod("setName", String.class);
        /** 等价于obj.setName("liubei"); **/
        method.invoke(obj, "liubei");

        method = clazz.getDeclaredMethod("getName");
        Object returnValue = method.invoke(obj);
        System.out.println(returnValue);

        Method method2 = clazz.getDeclaredMethod("test", String.class,
                int.class);
        /** 获取方法的修饰符 **/
        int i = method2.getModifiers();
        System.out.print(Modifier.toString(i) + " ");
        /** 获取方法的返回类型 **/
        Class c = method2.getReturnType();
        System.out.print(c.getName() + " ");
        /** 获取方法名 **/
        System.out.print(method2.getName() + "(");
        /** 获取参数列表 **/
        Class[] cs = method2.getParameterTypes();
        System.out.print(Arrays.toString(cs));
        System.out.print(")");
    }

}

在运行以后,控制台输入:com.xingpd.code.MyUser 按回车,效果如下:

初识Java反射机制——Reflection(二)_第1张图片

MyUser类(存在于com.xingpd.code包里边):

class MyUser {
    private String name = "guanyu";
    private int age = 25;

    public final String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public MyUser(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public MyUser() {
        super();
    }

    public void test(String str, int i) throws Exception {
    }
}

反射当中,Field是属性类,它生成的对象就是某个指定类的某个属性;
Method是方法类,它生成的对象就是指定的某个类的某个方法。

method.invoke()方法的意思就是相当于引用、借助于原类的那个方法,他们的作用相同,比如说原类有一个方法叫getName(),那么通过反射拿到的method对象:

Method method = clazz.getDeclaredMethod("getName");
Object returnValue = method.invoke(obj);

这里returnValue就是getName所返回的对象,所以说反射拿到的方法和原方法一样的功能调用。

你可能感兴趣的:(java)