反射定义:
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.csdn.net/sinat_38259539/article/details/71799078
https://blog.csdn.net/yanghao201607030101/article/details/107675509