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

来源:互联网 发布:淘宝现金红包怎么设置 编辑:程序博客网 时间:2024/05/20 03:46

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

首先看一个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 按回车,效果如下:

这里写图片描述

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所返回的对象,所以说反射拿到的方法和原方法一样的功能调用。

1 0
原创粉丝点击