java开发之框架基础技术反射

什么是反射:在Java开发中,反射是一种强大的技术,允许程序在运行时检查和修改类、方法、字段等结构。它允许程序在没有预先知识的情况下,动态地加载类、创建对象、调用方法以及访问或修改字段。这种能力使得Java程序能够更加灵活和动态,但同时也需要谨慎使用,因为它可能会牺牲一些编译时的类型安全性

Java反射常用API有哪些

在Java中,反射是由Java Reflection API支持的,它提供了一组类和接口来处理运行时的反射。以下是一些反射中常用的API:

1. `Class` 类:`Class` 对象表示运行时类。可以通过以下几种方式获取 `Class` 对象:
   - 使用 `getClass()` 方法:`Class clazz = Object.getClass();`
   - 使用 `.class` 语法:`Class clazz = String.class;`
   - 使用 `Class.forName(String className)` 方法:`Class clazz = Class.forName("java.lang.String");`

2. `Constructor` 类:`Constructor` 对象表示类的构造函数。可以使用 `getConstructors()`、`getDeclaredConstructors()` 等方法来获取构造函数。

3. `Method` 类:`Method` 对象表示类的方法。可以使用 `getMethods()`、`getDeclaredMethods()` 等方法来获取方法。

4. `Field` 类:`Field` 对象表示类的字段。可以使用 `getFields()`、`getDeclaredFields()` 等方法来获取字段。

5. `Modifier` 类:`Modifier` 类提供了一些静态方法来获取类型、类、Constructor、Method 和 Field 的修饰符。例如,`Modifier.isPublic(modifiers)` 可以用来判断一个成员是否被声明为 public。

6. `Type` 接口:`Type` 接口是表示 Java 类型(类、接口、数组、基本类型等)的顶层接口。`ParameterizedType`、`GenericArrayType`、`WildcardType` 和 `TypeVariable` 都实现了 `Type` 接口。

7. `AnnotatedElement` 接口:`AnnotatedElement` 接口提供了访问注解的方法,例如 `isAnnotationPresent(Class<? extends Annotation> annotationType)` 和 `getAnnotation(Class<T> annotationType)`。

8. `Proxy` 类:`Proxy` 类用于动态代理,可以创建实现任意接口的代理实例。

9. `InvocationHandler` 接口:与 `Proxy` 类一起使用,用于处理代理实例的方法调用。

这些API可以用来执行动态代码

要获取一个类的实例(Class实例),可以使用Java反射机制中的 .class 属性或者 Class.forName() 方法。这些方法允许您在运行时获取类的信息和实例化类。

使用 .class 属性

在Java中,每个类都有一个隐含的静态成员 .class,它表示该类的 Class 对象。可以通过以下方式获取类的实例:

Class<?> clazz = MyClass.class;

这将返回 MyClass 类的 Class 对象 clazz

使用 Class.forName()

如果您只知道类的名称(作为字符串),可以使用 Class.forName() 方法来获取类的实例。例如:

String className = "com.example.MyClass";
try {
    Class<?> clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

这将根据字符串 "com.example.MyClass" 找到并返回对应的 Class 对象 clazz。需要注意的是,Class.forName() 方法在查找类时需要指定类的全限定名(包括包路径)。

获取实例化的对象

有了 Class 对象之后,您可以通过反射来实例化这个类的对象:

try {
    MyClass instance = (MyClass) clazz.getDeclaredConstructor().newInstance();
    // 使用 instance 进行操作
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
    e.printStackTrace();
}

这段代码假设 MyClass 有一个无参构造方法,通过 clazz.getDeclaredConstructor().newInstance() 来创建 MyClass 的实例 instance

总结来说,获取类的实例需要使用 Java 反射机制中的 .class 属性或者 Class.forName() 方法来获取 Class 对象,然后通过 Class 对象实例化该类的对象。

使用Class.newlnstance()方法创建一个Person的实例

try {
        Class clz=Class.forName("com.bdqn.pojo.Person");
        Object obj=clz.newInstance();
        System.out.println(obj);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值