Java 反射

反射的概述【理解】

是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调 用方法的一种机制。
由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展。
通俗得讲,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

获取Class类对象的三种方式

  • 类名.class属性
  • 对象名.getClass()方法
  • Class.forName(全类名)方法
public static void main(String[] args) throws ClassNotFoundException {
    Class<Student> c1=Student.class;
    //使用类的class属性来获取该类对应的Class对象
    System.out.println(c1);
    Student s1=new Student();
    //调用对象的getClass()方法,返回该对象所属类对应的Class对象
    Class<?extends Student> c2=s1.getClass();
    System.out.println(c2);
    System.out.println(c1==c2);
    //使用Class类中的静态方法forName(String className)
    Class<?> c3=Class.forName("反射.Student");
    System.out.println(c3);
}
}

反射获取构造方法并使用

Class类获取构造方法对象的方法

在这里插入图片描述

public static void main(String[] args) throws ClassNotFoundException, 
NoSuchMethodException, IllegalAccessException, InvocationTargetException, 
InstantiationException { 
//获取Class对象 
Class<?> c = Class.forName("com.itheima_02.Student");
//Constructor<?>[] getConstructors() 返回一个包含 Constructor对象的数组, 
Constructor对象反映了由该 Class对象表示的类的所有公共构造函数 
// Constructor<?>[] cons = c.getConstructors(); 
//Constructor<?>[] getDeclaredConstructors() 返回反映由该 Class对象表示的类 
声明的所有构造函数的 Constructor对象的数组 
Constructor<?>[] cons = c.getDeclaredConstructors(); 
for(Constructor con : cons) { 
System.out.println(con); 
}
System.out.println("--------"); 
//Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 
Constructor对象,该对象反映由该 Class对象表示的类的指定公共构造函数 
//Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回 
一个 Constructor对象,该对象反映由此 Class对象表示的类或接口的指定构造函数 
//参数:你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象 
Constructor<?> con = c.getConstructor(); 
//Constructor提供了一个类的单个构造函数的信息和访问权限 
//T newInstance(Object... initargs) 使用由此 Constructor对象表示的构造函数, 
使用指定的初始化参数来创建和初始化构造函数的声明类的新实例 
Object obj = con.newInstance(); 
System.out.println(obj); 
// Student s = new Student(); 
// System.out.println(s); 
} 

反射获取构造方法并使用练习

public class ReflectDemo03 { 
public static void main(String[] args) throws ClassNotFoundException, 
NoSuchMethodException, IllegalAccessException, InvocationTargetException, 
InstantiationException { 
//获取Class对象 
Class<?> c = Class.forName("com.itheima_02.Student"); 
//private Student(String name) 
//Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 
Constructor<?> con = c.getDeclaredConstructor(String.class); 
//暴力反射 
//public void setAccessible(boolean flag):值为true,取消访问检查 
con.setAccessible(true); 
Object obj = con.newInstance("林青霞"); 
System.out.println(obj); 
} 
}

此处setAccessible(boolean flag):值为true,作用取消访问检查,即可得到类的私有构造方法

反射获取成员变量并使用

在这里插入图片描述

    public static void main(String[] args) throws ClassNotFoundException,
            NoSuchFieldException, NoSuchMethodException, IllegalAccessException,
            InvocationTargetException, InstantiationException {
//获取Class对象
        Class<?> c = Class.forName("com.itheima_02.Student");
//Field[] getFields() 返回一个包含 Field对象的数组, Field对象反映由该 Class对

//Field[] getDeclaredFields() 返回一个 Field对象的数组,反映了由该 Class对象

        Field[] fields = c.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("--------");
//Field getField(String name) 返回一个 Field对象,该对象反映由该 Class对象表

//Field getDeclaredField(String name) 返回一个 Field对象,该对象反映由该

        Field addressField = c.getField("address");
//获取无参构造方法创建对象
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();

        addressField.set(obj, "西安"); //给obj的成员变量addressField赋值为西安
        System.out.println(obj);
    }
}

Field类用于给成员变量赋值的方法

在这里插入图片描述

package 反射;

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

public class Reflectdemo {

    public static void main(String[] args) throws ClassNotFoundException,
            NoSuchFieldException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
//获取Class对象
            Class<?> c = Class.forName("反射.Student");
//Student s = new Student();
            Constructor<?> con = c.getConstructor();
            Object obj = con.newInstance();
            System.out.println(obj);
//s.name = "林青霞";
// Field nameField = c.getField("name"); //NoSuchFieldException:
            Field nameField = c.getDeclaredField("name");
            nameField.setAccessible(true);
            nameField.set(obj, "林青霞");
            System.out.println(obj);
//s.age = 30;
            Field ageField = c.getDeclaredField("age");
            ageField.setAccessible(true);
            ageField.set(obj, 30);
            System.out.println(obj);
//s.address = "西安";
        }
    }

反射获取成员方法并使用

在这里插入图片描述

反射的案例

运行配置文件中指定类的指定方法

  • 案例需求

通过反射技术,向一个泛型为Integer的集合中添加一些字符串数据

  • 代码实现
public class ReflectTest01 { 
public static void main(String[] args) throws Exception { 
//创建集合 
ArrayList<Integer> array = new ArrayList<Integer>(); 
// array.add(10); 
// array.add(20); 
// array.add("hello"); 
Class<? extends ArrayList> c = array.getClass(); 
Method m = c.getMethod("add", Object.class); 
m.invoke(array,"hello"); 
m.invoke(array,"world"); 
m.invoke(array,"java"); 
System.out.println(array); 
} 
}

运行配置文件中指定类的指定方法

  • 案例需求

通过反射运行配置文件中指定类的指定方法

  • 代码实现
 Properties p=new Properties();
        FileReader fr=new FileReader("A:\\Java黑马程序员\\java基础资料\\第二阶段资料\\二阶day15资料\\笔记\\test.txt");
        p.load(fr);
        Class C1=Class.forName(p.getProperty("Classname"));

        Object o=C1.newInstance();
        Method m=C1.getMethod(p.getProperty("Methodname"));
        m.invoke(o);

我们可以使用配置文件来 此例为test.txt来运行程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas的另一个重要数据结构,似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 来表示数据库表,使用的实例表示表的行。 开发者可以定义之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值