首 页 行业资讯 新车 试驾评测 养车用车 车型库

java反射机制的作用 及其它的好处

发布网友 发布时间:2022-04-21 23:42

我来回答

3个回答

热心网友 时间:2023-02-07 07:50

反射其实就是程序能够自检查自身信息。就像程序会照镜子反光看自己。

在程序中可以检查某个类中的方法属性等信息,并且能够动态调用。
这样可以写出很灵活的程序。
比如要把一个对象中的数据copy到另外一个对象中,规则是属性名相同就copy,
就可以用反射来做,不需要指定每个属性的名字,只要动态从类中取得信息,
再判断属性名是否相同即可。当然应用还有很多。

反射可以结合Java的字节码,使用ASM和cglib等库,还能动态生成类。
hibernate的延迟载入,spring的AOP都是这么实现的

反射给Java带来了一些动态性。不过虽然很好,但毕竟还是有一定局限性的。另外ASM,cglib使用还是不放便。因此一些纯动态语言现在是一个重要发展趋势,比如ruby,python等,程序很容易动态生成。

热心网友 时间:2023-02-07 09:08

java反射机制能够知道类名而不实例化对象的状态下,获得对象的属性或调用方法。一般都是在配置文件中才用的。hibernate的映射文件,spring的配置文件都是通过反射做的。

热心网友 时间:2023-02-07 10:43

java程序在运行过程中,很多类中的方法,不是一开始就全部要执行,如果我们在程序运行过程中想动态灵活的执行某个类中的方法时,用反射机制可以实现
例子:
------------------------------------------------类一-----------------------------------------------------------------
package com.sunyard.reflect;

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

public class ReflectTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Class<?> className className = Class.forName("com.sunyard.reflect.Display");//得到class类
Object object = className.newInstance();//得到一个实例
Method method = className.getMethod("display", new Class[]{});//得到相应方法
method.invoke(object, new Object[]{});//执行方法
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
------------------------------------------------------类二----------------------------------------------------------
package com.sunyard.reflect;

public class Display {
public static void display(){
System.out.println("恭喜你!反射机制执行成功");
}

}
--------------------------------如果我们把类一中Class.forName("com.sunyard.reflect.Display")里面的类用一个动态的东西获取,如:先封装好配置文件等,就可以实现动态了,例如:在socket编程中我们服务端要根据我们客户端传过来的东西去执行相应类中的方法时,我们可以先在一个配置文件中配好类和方法和一个标识,这样的话,我们就实现了动态方法调用了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com