通过反射 动态创建对象

package com.demo1.refulaction;

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

/**
 * Created by 聪哥 on 2020/9/23.
 */
public class Paren {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class c1=Class.forName("com.demo1.refulaction.Student");
        /*Method[] methods = c1.getMethods();//打印公开方法
        for (Method mo:methods) {
            System.out.println(mo);
        }*/
        Student student=(Student) c1.newInstance();//创建对象
        Constructor declaredConstructor = c1.getDeclaredConstructor(int.class, String.class, double.class);//通过构造器创建对象
        Student o = (Student) declaredConstructor.newInstance(1,"小明",12.3);
        //通过反射获取一个方法
        Method setName = c1.getMethod("setName", String.class);
        //invoke:激活反射对象
        setName.invoke(student, "小明");
        System.out.println(student.getName());
        //通过反射操作属性
        Field name = c1.getDeclaredField("name");
        //不能直接操作私有属性,需要关闭安全检测,影响性能
        name.setAccessible(true);
        name.set(student,"小王");
        System.out.println(student.getName());

    }
}


Java中,反射是一种强大的机制,它允许程序在运行时检查或修改程序的行为。通过反射,可以动态创建对象,即使在编译时还不知道对象的具体型。以下是使用反射动态创建对象的基本步骤: 1. 获取的Class对象:首先,需要使用Class的`forName`方法或者通过一个的`getClass`方法来获取的Class对象。Class对象的表示,可以用来动态地操作。 2. 获取构造函数:通过Class对象的`getConstructor`方法,可以根据构造函数的参数型获取到一个具体的`Constructor`对象。如果构造函数有参数,需要提供相应的参数型。 3. 创建对象使用得到的`Constructor`对象的`newInstance`方法,传入相应的参数(如果没有参数则不需要),来创建的实例。 以下是一个简单的示例代码: ```java import java.lang.reflect.Constructor; public class ReflectExample { public static void main(String[] args) { try { // 假设有一个名为com.example.MyClass Class<?> clazz = Class.forName("com.example.MyClass"); // 假设com.example.MyClass有一个无参构造函数 Object myObject = clazz.getDeclaredConstructor().newInstance(); // 如果有参数构造函数,可以这样调用 // Constructor<?> constructor = clazz.getConstructor(参数型1.class, 参数型2.class, ...); // Object myObject = constructor.newInstance(参数1, 参数2, ...); // 现在myObject就是动态创建的com.example.MyClass的实例了 } catch (Exception e) { e.printStackTrace(); } } } ``` 使用反射动态创建对象时,需要注意以下几点: - 反射通常会比直接实例化对象的性能差,因为它需要更多的检查。 - 使用反射时应该处理好相关的异常,例如`ClassNotFoundException`、`NoSuchMethodException`、`InstantiationException`、`IllegalAccessException`以及`InvocationTargetException`。 - 反射破坏了封装性,应当谨慎使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值