java反射机制

java反射机制

0)获取Class对象的三种方法

package com.bean;

/**
 * @author: 肖德子裕
 * @date: 2018/8/29 08:35
 * @description: 用户实体类
 */
public class User {
    private int id;
    private String name;
    private int age;

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public 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;
    }
}

 

package com.test;

/**
 * @author: 肖德子裕
 * @date: 2018/8/29 08:34
 * @description: 测试java.lang.Class对象的获取方式
 * java不是动态语言,但是可以通过反射做动态操作
 * 动态语言:程序运行时可以改变程序结构或变量类型(如:Python;JS)
 * 一个类被加载后,JVM会创建该类的一个Class对象,类的整个结构会放到该对象中
 * 这个对象就像镜子一样,可以看见该类的所有信息(所以叫反射机制)
 * 一个类只对应一个Class对象
 * 反射在提高开发效率的同时会增加程序运行的时间,可以禁止安全检查,以提高运行速度(设置setAccessible(true))
 */
public class Demo1 {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("com.bean.User");
        System.out.println(clazz);

        Class strClass = String.class;

        Class strClass2 = args.getClass();
        System.out.println(strClass == strClass2);
    }
}

 

1)获取类的信息

package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author: 肖德子裕
 * @date: 2018/8/29 13:56
 * @description: 利用反射的API,获取类的信息
 */
public class Demo2 {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("com.bean.User");

        //获取包名+类名
        System.out.println(clazz.getName());
        //获取类名
        System.out.println(clazz.getSimpleName());
        System.out.println("==========================");

        //获取非私有的属性
        Field[] fields = clazz.getFields();
        System.out.println(fields.length);
        //获取所有属性,包括私有
        Field[] fields1 = clazz.getDeclaredFields();
        for (Field field : fields1) {
            System.out.println("属性:" + field);
        }
        //获取指定属性
        Field field = clazz.getDeclaredField("name");
        System.out.println("name:" + field);
        System.out.println("==========================");

        //获取所有方法
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println("方法:" + method);
        }
        //获取指定方法(无参)
        Method method = clazz.getDeclaredMethod("getName", null);
        //获取指定方法(有参)
        Method method1 = clazz.getDeclaredMethod("setName", String.class);
        System.out.println("==========================");

        //获取所有构造器(构造方法)
        Constructor[] constructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println("构造器:" + constructor);
        }
        //获取指定构造器
        Constructor constructor = clazz.getDeclaredConstructor(int.class, String.class, int.class);
        System.out.println("指定构造器:" + constructor);
    }
}

 

2)执行方法

package com.test;

import com.bean.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author: 肖德子裕
 * @date: 2018/8/29 14:21
 * @description: 利用反射的API,获取实例,进行操作
 */
public class Demo3 {
    public static void main(String[] args) throws Exception {
        Class<User> clazz = (Class<User>) Class.forName("com.bean.User");

        //调用无参初始化对象
        User user = clazz.newInstance();
        //调用有参初始化对象
        Constructor<User> constructor = clazz.getDeclaredConstructor(int.class, String.class, int.class);
        User user1 = constructor.newInstance(001, "xdzy", 18);
        System.out.println(user1.getName());
        System.out.println("=====================");

        //执行方法
        User user3 = clazz.newInstance();
        Method method = clazz.getDeclaredMethod("setName", String.class);
        method.invoke(user3, "xdzy");
        System.out.println(user3.getName());
        System.out.println("=====================");

        //操作属性
        User user4 = clazz.newInstance();
        Field field = clazz.getDeclaredField("name");
        //禁止安全检查(直接可以访问所有属性)
        field.setAccessible(true);
        field.set(user4, "xdzy");
        System.out.println(user4.getName());
        System.out.println(field.get(user4));
    }
}

 

原文地址:https://www.cnblogs.com/xdzy/p/9554555.html