动态创建对象

动态创建对象

有了Class对象,能做什么?

  • 创建类的对象:调用Class对象的newInstance()方法

    • 1)类必须有一个无参数的构造器

    • 2)类的构造器的访问权限需要足够

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

  • 步骤如下:

    • 1)通过Class类的getDeclaredConstructor(Class...parameterTypes)取得本类的指定形参类型的构造器

    • 2)向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数

    • 3)通过Constructor实例化对象

调用指定的方法

通过反射,调用类中的方法,通过Method类完成

  1. 通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型

  2. 之后使用Object invoke(Object obj,Object[] args)进行调用,并向方法中传递要设置的obj对象的参数信息

Object invoke(Object obj,Object... args)

  • Object对应原方法的返回值,若原方法无返回值,此时返回null

  • 若原方法若为静态方法,此时形参Object obj可为null

  • 若原方法形参列表为空,则Object[] args为null

  • 若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法

setAccessible

  • Method和Field、Constructor对象都有setAccessible()方法

  • setAccessible作用是启动和禁用访问安全检查的开关

  • 参数值为true则指示反射的对象在使用时应该取消Java语言访问检查

    • 提高反射的效率。如果代码中必须用反射,而改句代码需要频繁的被调用,那么请设置为true。

    • 使得原本无法访问的私有成员也可以访问

  • 参数值为false则指示反射的对象应该实施Java语言访问检查

复制代码
package com.hua.reflection;

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

public class Test09 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得Class对象
        Class c1 = Class.forName("com.hua.reflection.User");
        //构造一个对象
//        User user = (User) c1.newInstance();
//        System.out.println(user);
        //通过构造器创建对象
//        Constructor constructor = c1.getDeclaredConstructor(String.class,int.class,int.class);
//        User user2 = (User) constructor.newInstance( "杨不悔", 1, 18);
//        System.out.println(user2);

        //通过反射调用普通方法
       User user3 = (User) c1.newInstance();
        //通过反射获取一个方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        //invoke :激活的意思
        //(对象,"方法的值")
        setName.invoke(user3,"杨不悔");
        System.out.println(user3.getName());

        //通过反射操作属性
        User user4 = (User) c1.newInstance();
        Field field = c1.getDeclaredField("name");
        //不能直接操作私有属性,我们需要关闭程序的安全检测,属性或者方法的setAccessible(true)
        field.setAccessible(true);
        field.set(user4,"yangbuhui");
        System.out.println(user4.getName());

    }
}
复制代码

 

posted @   少时凌云志  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示