反射定义:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射能够在程序执行时取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
反射在日常开发中用的比较少,能说的上来的比如用JDBC 连接数据库时使用 Class.forName()通过反射加载数据库的驱动程序,虽然用的比较少,但是反射搞懂反射能够帮助看懂一些框架的源码,比如Spring框架等。
以下是我的联系案例:
public class FanSheClass {
private String name;
public FanSheClass() {
}
public FanSheClass(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void say(String word) {
System.out.println("my name is "+this.name+",I wanna say that "+word);
}
private void doSth() {
System.out.println("I did sth, my name is "+this.name);
}
}
-------------------------------------------------------------
public class TestFanShe {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
//获取Class对象
Class<?> fansheClass = Class.forName("base.FanSheClass");
//生成实例
Object o =fansheClass.getConstructor().newInstance();
//遍历打印类的方法
for (Method method : fansheClass.getDeclaredMethods()) {
System.out.println(method.getName());
}
//调用类的方法 fansheClass.getDeclaredMethod("say",String.class).invoke(o,"invoked by fanshe");
Field name = fansheClass.getDeclaredField("name");
//暴力反射修改私有属性
name.setAccessible(true);
//修改类的属性
name.set(o, "reflected");
Method doSth = fansheClass.getDeclaredMethod("doSth");
//暴力反射
doSth.setAccessible(true);
doSth.invoke(o);
}
}
通过 Class.forName(“base.FanSheClass”)获取特定的Class对象,再通过Class对象获取构造方法,然后通过构造方法的newInstance()方法生成一个实例。Class对象的getDeclaredField()、getDeclaredMethod()方法能够获取该类中方法和字段,如果是私有的可以通过设置setAccessible来是西安暴力反射。
https://blog.youkuaiyun.com/sinat_38259539/article/details/71799078
https://blog.youkuaiyun.com/yanghao201607030101/article/details/107675509
Java反射机制详解
本文深入解析Java反射机制,包括如何在运行时获取类的内部信息,如属性和方法,以及如何调用对象的任意方法。通过示例代码展示反射的应用,如通过反射加载数据库驱动程序。理解反射有助于阅读如Spring框架等复杂系统的源码。
2247

被折叠的 条评论
为什么被折叠?



