Java反射

通过反射的方法设计应用程序,提高更好的扩展性。

 

获取字节码文件对象的方式:

1. 通过Object类中的getClass方法。
    虽然通用,但是前提必须有指定类,并对该类进行对象的创建,才可以调用getClass方法。

 

2.  使用的任意数据类的一个静态成员class,所有的数据类型都具备的这一个属性。
    好处:不用new对象。但是,还需要使用具体的类。

3.  使用Class类中的forName方法。通过给定类名来获取对应的字节码文件对象。
     只要知道类的名字就可以了。获取对应的字节码文件直接由forName方法自动完成。
这就是反射技术使用的获取字节码文件对象的方式。

 

通过newInstance()就可以创建字节码对象所表示的类的实例。

通过new创建给定的类的实例。
调用该类的构造函数。
  * 通常被反射的类都会有提供空参数的构造函数。
  * 如果没有对应的构造函数,会报  InstantiationException
  * 如果有提供,但是权限不够,会报 lllegalAccessException

Person p = new Person();
加载Person类,并将Person类封装成字节码文件对象。
通过new创建Person对象。
调用构造函数对对象初始化。

 

如果要通过指定的构造函数初始化对象怎么办呢?

1. 获取字节码文件对象。
2. 获取给定的构造函数。
3. 通过构造函数初始化对象。

复制代码
public static void getConstructorDemo() throws Exception {
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);
        
        //获取指定的构造器。获取Person类中两个参数string,int的构造函数。
        Constructor cons = clazz.getConstructor(String.class,int.class);
        
        //有了构造器对象后,通过构造器对象来初始化给类对象。
        Object obj = cons.newInstance("wangwu",23);
        //Person p = new Person("lisi",21);  
}
复制代码

 

获取字段

复制代码
public static void getFieldDemo() throws Exception {
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);
        
        String fieldName = "age";
        
        //获取age字段对象。
//        Field field = clazz.getField(fieldName);//获取是公共的字段。
        Field field = clazz.getDeclaredField(fieldName);
        
//        getXXX:获取都是类中公共的成员。
//        getDeclaredXXX:获取本类中已有的成员。
//        System.out.println(field);
        
        //对其进行值的设置,必须先有对象。
        Object obj = clazz.newInstance();
        
        //通过查找父类AccessiableObject的方法。setAccessiable(true);
        field.setAccessible(true);//取消权限检查,暴力访问。一般不访问私有。
        field.set(obj, 30);//IllegalAccessException:age字段是私有的。
        
        System.out.println(field.get(obj));
    }
复制代码

获取方法

复制代码
public static void getMethodDemo2() throws Exception {    
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);
        String methodName = "staticShow";    
        Method method = clazz.getMethod(methodName, null); // null表示没有参数  和返回值完全没有关系
        method.invoke(null, null);  对象设置为 null   第二个null表示没有参数
    }

    public static void getMethodDemo() throws Exception {
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);    
        String methodName = "show";   
        Method method = clazz.getMethod(methodName, String.class,int.class);
        Object obj = clazz.newInstance();
        method.invoke(obj, "wangcai",20);   实例方法要手动传入 对象
    }
复制代码

 

posted @   escapist  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示