反射机制的简单案例

案例:
* 需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
* 实现:
1. 配置文件
2. 反射
* 步骤:
1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2. 在程序中加载读取配置文件
3. 使用反射技术来加载类文件进内存
4. 创建对象
5. 执行方法

配置文件:执行Person类中的eat方法

className=cn.itcast.domain.Person
methodName=eat
执行结果
eat...

配置文件:执行Student类中的sleep方法

className=cn.itcast.domain.Student
methodName=sleep
执行结果
sleep...

需求实现

//1.加载配置文件
 //1.1创建Properties对象
Properties pro = new Properties();
//1.2加载配置文件,转换为一个集合
//1.2.1获取class目录下的配置文件
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);
//1.1创建Properties对象
Properties pro = new Properties();
//1.2加载配置文件,转换为一个集合
//1.2.1获取class目录下的配置文件
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);

//2.获取配置文件中定义的数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");


//3.加载该类进内存
Class cls = Class.forName(className);
//4.创建对象
Object obj = cls.newInstance();
//5.获取方法对象
Method method = cls.getMethod(methodName);
//6.执行方法
method.invoke(obj);

在框架中,在需要改动参数时,只需要改动配置文件中的内容即可,这就是反射机制的优势。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
反射是指在程序运行时动态地获取的信息、构造对象、调用方法等。在Java中,可以通过使用反射机制获取一个的信息、构造对象、调用方法、访问属性等。 下面是一个反射简单示例,它演示了如何使用反射机制获取的信息、构造对象、调用方法和访问属性: ``` import java.lang.reflect.*; public class ReflectionExample { public static void main(String[] args) throws Exception { // 获取Person的Class对象 Class<?> cls = Class.forName("Person"); // 构造Person对象 Constructor<?> constructor = cls.getConstructor(String.class, int.class); Object person = constructor.newInstance("张三", 20); // 调用Person对象的sayHello方法 Method sayHelloMethod = cls.getMethod("sayHello"); sayHelloMethod.invoke(person); // 访问Person对象的name属性 Field nameField = cls.getDeclaredField("name"); nameField.setAccessible(true); String name = (String) nameField.get(person); System.out.println("name = " + name); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public void sayHello() { System.out.println("Hello, my name is " + name + ", I'm " + age + " years old."); } } ``` 上述代码中,首先使用`Class.forName()`方法获取了`Person`的`Class`对象,然后使用`getConstructor()`方法获取了`Person`的构造方法,并使用`newInstance()`方法构造了一个`Person`对象。接着使用`getMethod()`方法获取了`Person`的`sayHello()`方法,并使用`invoke()`方法调用了该方法。最后使用`getDeclaredField()`方法获取了`Person`的`name`属性,并使用`get()`方法获取了该属性的值。 注意,访问`name`属性时需要先使用`setAccessible(true)`方法将其设置为可访问,因为`name`属性是`private`的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值