java 反射

在Java中,我们能通过反射知道类的所有成员变量和成员方法,调用所有类和成员方法。

例:entity.User

public class User {

    private String privateMsg = "I'm private";

    public String publicMsg = "I'm public";
    
    private static String staticMsg="I'm static";

    private void privateMethod() {
        System.out.println("I'm privateMethod");
    }

    public void publicMethod() {
        System.out.println("I'm publicMethod");
    }

    private User() {
    }

}

 

 

 

 

一、类类型(class type)的获取

下面是获取类类型的三种方法:

    public static void main(String[] args) throws ClassNotFoundException {

        // 方法一
        Class<? extends User> c1 = new User().getClass();

        // 方法二
        Class<User> c2 = User.class;

        // 方法三
        Class<?> c3 = Class.forName("entity.User");

        System.out.println(c1 == c2); // output: true
        System.out.println(c1 == c3); // output: true
    }

 

 

二、成员变量

1.所有成员变量的获取

  getDeclaredFields()方法获取所有成员变量

  getFields() 方法获取public成员变量

 

Class<?> cls = Class.forName("entity.User");
Field[] fields1
= cls.getDeclaredFields(); //获取所有成员变量
Field[] fields2
= cls.getFields(); //获取public成员变量

 

2.变量的操作

    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("entity.User");
        User user = (User) cls.newInstance();  //获得User对象实例
        Field field = cls.getDeclaredField("privateMsg");
        field.setAccessible(true);  
        System.out.println(field.get(user));
        field.set(user, "I'm new");  //修改变量的值
        System.out.println(field.get(user));
    }

输出:

I'm private
I'm new

 

三、成员方法

1.所有成员方法的获取

与成员变量的获取方式类似:

Class<?> cls = Class.forName("entity.User");
Method[] methods1
= cls.getDeclaredMethods(); //获取所有方法
Method[] methods2
= cls.getMethods(); //获取所有public方法

2.成员方法的操作

    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("entity.User");
        User user = (User) cls.newInstance();
        Method method=cls.getDeclaredMethod("privateMethod");
        method.setAccessible(true);
        method.invoke(user);        
    }

输出:

I'm privateMethod

 

 

四、构造方法

1.所有构造方法的获取

Constructor<?> constructors1 = cls.getDeclaredConstructor();  //获取所有构造方法

Constructor<?> constructors2 = cls.getConstructor(); //获取public构造方法

2.通过构造方法创造对象

    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("entity.User");
        Constructor<?> constructor = cls.getDeclaredConstructor();  //获得构造方法
        constructor.setAccessible(true);  
        User user = (User) constructor.newInstance();  //获得对象实例
        System.out.println(user.getClass().getName());  //输出: entity.User
    }

 

 

五、静态成员变量和静态方法

对静态变量、静态方法方法操作与非静态变量和方法类似,区别是对静态变量和方法进行操作时无需创建对象,对象用null替代即可,如:

    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("entity.User");
        Field field = cls.getDeclaredField("staticMsg");
        field.setAccessible(true);
        System.out.println(field.get(null));
        field.set(null, "new");
        System.out.println(field.get(null));
    }

输出:

I'm static
new

 

posted @ 2016-04-05 15:53  maozs  阅读(162)  评论(0编辑  收藏  举报