动态创建对象执行方法

HeJin大约 1 分钟Java注解和反射

Class对象能做什么

  • 创建类的对象:调用Class对象的newInstance()方法
    • 类必须有一个无参数的构造器
    • 类的构造器的访问权限需要足够

难道没有无参的构造器就不能创建对象了吗?只要在操作的时候明确地调用类中的构造器,并将参数传递进去,才可以实例化操作。

代码

/**
 * @Description 反射动态创建对象
 * @Author Administrator
 * @Date 2020/12/2 12:43
 */
public class Test09 {

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

        // 获得Class对象
        Class c1 = Class.forName("com.hejin.reflection.User");

        /**
         * 1、构造对象:调用无参构造器
         */
        System.out.println("==================================");
        User user = (User) c1.newInstance();
        System.out.println(user);

        /**
         * 2、通过构造器创建对象:没有无参构造也能
         */
        System.out.println("==================================");
        Constructor constructor = c1.getDeclaredConstructor(int.class, String.class, int.class);
        User user1 = (User) constructor.newInstance(1,"张三",22);
        System.out.println(user1);

        /**
         * 3、通过反射调用普通方法
         */
        System.out.println("==================================");
        User user3 = (User) c1.newInstance();
        // 通过反射获取方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        // invoke(对象,对象的值)
        setName.invoke(user3,"李四");
        System.out.println(user3.getName());

        /**
         * 4、通过反射操作属性
         * 不能直接操作私有属性。通过属性或者方法的setAccessible方法,设置为true
         */
        System.out.println("==================================");
        User user4 = (User) c1.newInstance();
        Field name = c1.getDeclaredField("name");
        name.setAccessible(true);
        name.set(user4,"555");
        System.out.println(user4.getName());
    }
}

结果

==================================
User{id=0, name='null', age=0}
==================================
User{id=1, name='张三', age=22}
==================================
李四
==================================
555

Process finished with exit code 0