java中常用的反射

java中常用的反射

public class User {

    private String name;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

1、根据属性名称,利用反射射设置private属性的值

    //根据属性名称,利用反射射设置private属性的值
    public static void setPrivateValue(User user, String privateName, String privateValue) {
        try {
            Field privateStringField = user.getClass().getDeclaredField(privateName);
            privateStringField.setAccessible(true);
            privateStringField.set(user, privateValue);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
        User user = new User();
        setPrivateValue(user, "name", "hellworld");
         System.out.println(user.getName());//输出 hellworld

2、获取根据函数名调用函数,无参数

   //获取根据函数名调用函数,无参数
    public static Object callingMethod(User user, String methodName) {
        try {
            Method method = user.getClass().getDeclaredMethod(methodName);
            return method.invoke(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
  User user = new User();
  setPrivateValue(user, "name", "hellworld");
   System.out.println(callingMethod(user, "getName"));//输出 hellworld

3、获取根据函数名调用函数,带参数

  //获取根据函数名调用函数,有参数
    public static Object callingMethod(User user, String methodName, Class<?>[] cls, Object[] objs) {
        try {
            Method method = user.getClass().getDeclaredMethod(methodName, cls);
            return method.invoke(user, objs);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    User user = new User();
    callingMethod(user, "setName", new Class[]{String.class}, new Object[]{"hellowrld"});
     System.out.println(callingMethod(user, "getName"));//输出 hellworld
<think>好的,用户想了解Java反射相关的常用API示例。首先,我需要回忆反射的核心类和它们的方法反射主要涉及Class类,以及java.lang.reflect包中的Field、Method、Constructor等。 用户可能知道反射的基本概念,但需要具体的使用示例。我应该从如何获取Class对象开始,比如通过Class.forName()、对象.getClass()或者类名.class。接着,需要展示如何获取字段、方法和构造函数,并演示如何访问和操作它们,比如获取私有字段的值或调用私有方法。 还要注意用户提到的引用资料,引用[1]提到了获取类的字段和方法,引用[3]提到了反射API的结构。需要结合这些内容,给出具体的代码示例,并确保每个步骤都有说明。比如,Field的get()和set()方法,Method的invoke(),以及设置访问权限的setAccessible()。 另外,用户可能需要了解实际应用场景,比如动态代理或框架中的使用,如Spring,但问题主要聚焦在API示例上,所以重点放在代码演示。同时,要提醒反射的使用注意事项,比如性能影响和安全性。 后,生成相关问题时要围绕反射的深入应用、优缺点、动态代理等,参考引用中的内容。确保回答结构清晰,步骤明确,代码正确,符合用户的中文要求。</think>### Java反射常用API及示例 Java反射API允许程序在运行时获取类的信息并动态操作对象。以下是核心API的使用示例: --- #### 1. **获取Class对象** ```java // 方式1:通过类名.class Class<?> clazz1 = String.class; // 方式2:通过对象.getClass() String str = "test"; Class<?> clazz2 = str.getClass(); // 方式3:通过Class.forName() Class<?> clazz3 = Class.forName("java.lang.String"); ``` --- #### 2. **获取字段信息** ```java Class<?> clazz = User.class; // 获取所有公共字段 Field[] publicFields = clazz.getFields(); // 获取所有字段(包括私有) Field[] allFields = clazz.getDeclaredFields(); // 获取特定字段并操作值 try { Field nameField = clazz.getDeclaredField("name"); nameField.setAccessible(true); // 允许访问私有字段 User user = new User(); nameField.set(user, "Alice"); // 设置字段值 Object value = nameField.get(user); // 获取字段值 } catch (Exception e) { e.printStackTrace(); } ``` --- #### 3. **获取方法信息** ```java Class<?> clazz = User.class; // 获取所有公共方法(包括继承的) Method[] publicMethods = clazz.getMethods(); // 获取所有声明的方法(包括私有) Method[] allMethods = clazz.getDeclaredMethods(); // 调用方法示例 try { Method method = clazz.getDeclaredMethod("setName", String.class); method.setAccessible(true); // 允许调用私有方法 User user = new User(); method.invoke(user, "Bob"); // 调用方法 } catch (Exception e) { e.printStackTrace(); } ``` --- #### 4. **操作构造函数** ```java Class<?> clazz = User.class; // 获取所有公共构造函数 Constructor<?>[] publicConstructors = clazz.getConstructors(); // 获取所有构造函数(包括私有) Constructor<?>[] allConstructors = clazz.getDeclaredConstructors(); // 创建对象实例 try { Constructor<?> constructor = clazz.getDeclaredConstructor(String.class); constructor.setAccessible(true); // 允许访问私有构造方法 User user = (User) constructor.newInstance("Charlie"); } catch (Exception e) { e.printStackTrace(); } ``` --- #### 5. **其他常用API** - **获取父类**:`clazz.getSuperclass()` - **获取接口**:`clazz.getInterfaces()` - **判断类型**:`clazz.isInterface()`, `clazz.isArray()` --- ### 反射的典型应用场景 1. **框架开发**:如Spring通过反射创建Bean实例并注入依赖[^2]。 2. **动态代理**:结合`java.lang.reflect.Proxy`实现接口的代理类。 3. **序列化工具**:JSON库(如Jackson)利用反射解析对象字段。 --- ### 注意事项 1. **性能问题**:反射操作比直接调用慢,频繁使用需谨慎。 2. **安全限制**:私有字段/方法需调用`setAccessible(true)`,可能触发安全管理器拦截[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值