Java☞反射

2019-05-27  本文已影响0人  小明今晚加班
  1. Class是一个描述类的类
  1. 如何获得一个Class对象:
package cn.ihep.reflect;

public class User {
    private String name;

    private Integer age;

    public User() {
        super();
    }

    public User(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    private void printMsg() {
        System.out.println("I am " + this.name + ", this year i am " + this.age + "  years old!!");
    }
}
---------------------------------------------------------- 
package cn.ihep.reflect;
import org.junit.Test;

public class TestReflect {
    @Test
    public void test1() throws Exception {
        Class clazz = User.class;
        System.out.println(clazz);

        Object u = new User();
        Class clazz2 = u.getClass();
        System.out.println(clazz2);

        Class clazz3 = Class.forName("cn.ihep.reflect.User");
        System.out.println(clazz3);
    }
}
  1. 关于Method

如何获取Method
1)、getDeclaredMethods:得到Method的数组;
2)、getDeclaredMethod(String methodName, Class ... parameterTypes);
如何调用Method
1)、如果方法是private修饰,需要先调用Method的 setAccessible(true),使其变为可访问
2)、method.invoke(obj, Object ...args)

@Test
    public void test2() throws Exception {
        Class clazz = Class.forName("cn.ihep.reflect.User");
        Method[] ms = clazz.getMethods();
        for (Method m : ms) {
            System.out.println(m);
        }

        System.out.println("---------------");
        Method[] ms2 = clazz.getDeclaredMethods();
        for (Method m : ms2) {
            System.out.println(m);
        }

        System.out.println("---------------");
        Method ms3 = clazz.getDeclaredMethod("setName", String.class);
        System.out.println(ms3);

        System.out.println("---------------");
        Object o = new User("xiaoming", 18);
        Method m4 = clazz.getDeclaredMethod("printMsg");
        m4.setAccessible(true);
        m4.invoke(o);
    }
  1. 关于Field

如果获取Field:getField(String fieldName [这种方法只能获得公有字段,想获取公有,私有等所有字段的话用getDeclaredField(s)方法]
如何获取Field的值:
1)、setAccessible(true)
2)、field.get(Object obj)
如何设置Field的值:
1)、field.set(Object obj, Object val)

@Test
    public void test3() throws Exception {
        Class clazz = Class.forName("cn.ihep.reflect.User");
        Field f1 = clazz.getDeclaredField("name");
        System.out.println(f1);
        System.out.println("----------------------------------");

        // 私有,公有的字段都能拿到
        Field[] fs = clazz.getDeclaredFields();
        for (Field f : fs) {
            System.out.println(f);
        }

        System.out.println("----------------------------------");
        //这个getFields()方法只能访问公有字段---得到的fs2是空的
        Field[] fs2 = clazz.getFields();
        

        System.out.println("----------------------------------");
        User u = new User("xiaoming", 18);
        // age字段是私有的
        Field f4 = clazz.getDeclaredField("age");
        f4.setAccessible(true);
        //无论是访问,或者是修改值,都需要设置setAccessible(true)
        Object o = f4.get(u);
        System.out.println(o);
        f4.set(u, 60);
        o = f4.get(u);
        System.out.println(o);
    }

总结:
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。

Java反射机制主要提供了以下功能:

上一篇 下一篇

猜你喜欢

热点阅读