Java 反射

本文深入解析Java反射机制,包括如何动态获取类信息、操作成员变量、调用方法及构造对象等核心功能。通过实例演示了反射的三种获取方式及常见方法的使用,如getField、setAccessible、getConstructor和invoke等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在程序运行过程中,可以对任意一个类型进行任意的操作。例如:加载任意类型、调用类型的任意方法、获取任意的成员变量、构造方法,可以创建该类型的对象。

2、如果要获取一个类型的各种内容,首先要获取这个类的字节码对象,解剖这个类型,获取类中的成员,需要使用Class类型中定义的方法。

3、反射就是这种动态的获取信息以及动态的访问成员的方式,称为反射。

4、获取类的字节码文件的三种方式

public class Test{

    public static void main(String[] args) throws Exception {
        Student stu = new Student();
        //第一种方法:通过对象名.getClass()
        Class class1 = stu.getClass();
        //第二种方法:类名.class
        Class class2 = Student.class;
        //第三种方法:Class.forName(全类名)
        Class class3 = Class.forName("com.test1.Student");
        System.out.println(class1==class2);
        System.out.println(class1==class3);
    }

}
class Student{
    private String name;
    int age;
    private void run() {
        System.out.println("run run run");
    }
    public void setName(String name) {
        this.name = name;
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Student() {}
}
获取.class文件的三种方式

5、反射常用方法代码示例

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

public class Test1 {

    public static void main(String[] args) throws Exception {
        Student stu = new Student();
        Class class1 = stu.getClass();
        //获取到的.class文件.getField(属性名)获取属性 
        //getFields获取所有属性到一个数组中
        Field f1 = class1.getDeclaredField("age");
        //可以设置属性
        System.out.println(stu.age);
        f1.set(stu, 15);
        System.out.println(stu.age);
        //上面的方式无法得到私有属性,需要暴力反射
        Field f2 = class1.getDeclaredField("name");
        //暴力反射也分getDeclaredField()和getDeclaredFields(),原理同getFiled和getFileds
        //想要设置私有属性必须使用setAccessible()将里面的参数设为true
        f2.setAccessible(true);
        System.out.println(stu);
        f2.set(stu, "qq");
        System.out.println(stu);
        
        //获取构造方法getConstructor(构造方法里的参数类型.class) 返回一个Constructor构造器
        //这个构造器可以使用newInstance() 创建一个object类型的对象
        Constructor c = class1.getConstructor(String.class,int.class);
        Object obj = c.newInstance("bb",10);
        Student stu2 = (Student)obj;
        System.out.println(stu2);
        //同理,构造器也有getConstructors和暴力反射
        
        //获取成员方法getMethod(方法名, 参数.class)
        Method m1 = class1.getMethod("setName",String.class);
        //方法的使用,方法.invoke(对象名,参数)
        m1.invoke(stu2, "hh");
        System.out.println(stu2);
        //同理,有getMethods和暴力反射getDeclaredMethod...
        Method m2 = class1.getDeclaredMethod("run",null);
        //同理需要设置权限
        m2.setAccessible(true);
        m2.invoke(stu);
    }

}
class Student{
    private String name;
    int age;
    private void run() {
        System.out.println(name+"run run run");
    }
    public void setName(String name) {
        this.name = name;
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Student() {}
    @Override
    public String toString() {
        return name+"..."+age;
    }
}

 

转载于:https://www.cnblogs.com/xfdhh/p/11260625.html

### Java反射机制使用教程及常见问题 Java反射机制是一种强大的工具,允许程序在运行时动态地检查和操作类、接口、字段和方法等内部信息[^1]。以下是关于Java反射机制的详细教程以及一些常见的问题。 #### 1. 反射机制的基本概念 Java反射机制是Java语言中一种动态访问、检测和修改自身的能力,主要作用是在运行时获取类的完整结构信息并对其进行操作[^2]。通过反射,可以实现以下功能: - 动态创建对象。 - 动态调用方法。 - 动态访问字段。 - 动态处理注解。 #### 2. 核心类与API Java反射的核心类位于`java.lang.reflect`包中,主要包括以下几类: - `Class`:表示类的运行时类对象,可以通过`Class.forName(String className)`或`Object.getClass()`获取。 - `Field`:表示类的成员变量。 - `Method`:表示类的方法。 - `Constructor`:表示类的构造方法。 #### 3. 使用示例 以下是一个简单的反射机制使用示例,展示了如何通过反射创建对象并调用方法。 ```java import java.lang.reflect.Method; public class ReflectionExample { public static void main(String[] args) throws Exception { // 获取目标类的Class对象 Class<?> cls = Class.forName("com.example.MyClass"); // 创建目标类的实例 Object obj = cls.getDeclaredConstructor().newInstance(); // 获取目标类的方法 Method method = cls.getMethod("myMethod", String.class); // 调用目标类的方法 method.invoke(obj, "Hello Reflection"); } } ``` #### 4. 性能问题 反射机制虽然强大,但在性能上存在一定的开销。例如,在大量调用反射方法时,其性能可能显著低于直接调用[^4]。因此,在实际开发中应权衡使用反射的必要性。 #### 5. 常见问题 - **安全性问题**:反射可以访问私有成员,这可能导致破坏封装性[^1]。 - **性能问题**:反射调用方法的性能比普通方法调用低[^4]。 - **异常处理**:反射操作容易抛出多种异常,如`ClassNotFoundException`、`NoSuchMethodException`等,需要妥善处理。 #### 6. 实际应用场景 Java反射机制在许多实际场景中发挥了重要作用,包括但不限于框架设计、动态代理、依赖注入、测试工具和序列化/反序列化等[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值