一 注解和反射机制是SPRING框架的基础
二 java是静态语言,有了反射机制,使其成为准动态语言
静态语言运行时结构不可变,不能动态编译,动态语言可以,如JavaScript,可通过注入运行新的代码块
三 反射机制即跟正常获取对象的方式反过来
正常:引入包——>new对象——>获得实例化对象
反射:实例化对象——>对象.getClass()方法——>获得完整包名
四 通过反射操作类shil
class Home{
String addr="北京市朝阳区一号";
int area=100;
Desk desk = new Desk();
public static void decoration(){
System.out.println("devoration my house~");
}
}
public class Main {
// 这里的throw 异常不需要敲,IDEA等开发工具中在获取类属性等代码行会自动提示抛异常,按照提示操作即可
public static void main(String[]args) throws NoSuchFieldException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
Home home = new Home(2,"zhaoyang road 10");
home.desk.eat(); // 使用组合对象desk的方法
Animal dog=new Dog();
test(home);
}
public static void test(Object object) throws NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InvocationTargetException {
// 反向获取对象的类的完整包名
Class objectClass=object.getClass();
System.out.println("objectClass = " + objectClass);
// 反向获取对象的类的属性信息
Field areaFiled= objectClass.getDeclaredField("area");
// 确定属性类型是int,通过 getInt()获取, 入参=对象本身
System.out.println("areaFiled.getInt(object) = " + areaFiled.getInt(object));
// System.out.println("addrFiled = " + addrFiled);
// 反向获取对象的类的方法并通过 invoke() 方法调用
Method method1=objectClass.getMethod("decoration");
method1.invoke(object); // 传入对象本身
}
}
运行结果:
c = class com.company.Home
aareaFiled.getInt(object) = 100
devoration my house~