###反射
1.是JAVA API,是Java提供的现成的类!
- 接受API提供的功能!
2.是Java提供的动态执行机制,动态加载类,动态创建对象
,动态访问属性,动态调用方法。
##静态与动态
静态:事先约定的规则,执行期间按照固定规则执行。
动态:事先没有约定,在执行期间动态确定执行规则。
JAVA中的静态执行:编译已经就确定执行规则(执行次序),
在运行期间按照编译结果顺序执行。
JAVA中的动态执行:运行期间才能确定加载那些类,创建哪
些对象,执行哪些方法...
###动态加载类
Java提供动态加载类的API
Class cls = Class.forName(类名);
###动态创建对象
语法:
Object obj = cls.newInstance();
执行cls引用的类信息中的无参数构造器,动态创建实例。如果
类没有无参数构造器,则抛出异常!
提示:反射可以调用有参数构造器.
###动态获取类的方法信息
Method[] methods = class.getDeclaredMethods();
###动态执行方法
语法:
method.invoke(执行方法的对象,传递的参数)
>必须在对象上执行一个非静态方法,调用方法时必须有对象。
>在invoke方法执行时候,必须传递包含当前方法的对象!!
Scanner in = new Scanner(System.in);
System.out.println("输入类名:");
String className = in.nextLine();
//动态加载类
Class cls = Class.forName(className);
Object obj = cls.newInstance();
//动态获取全部方法
Method[] methods = cls.getDeclaredMethods();
//迭代方法查找以test开头的方法
for (Method method: methods) {
if (method.getName().startsWith("test")){
method.invoke(obj);
}
}###使用invoke
Object obj =
method.invoke(对象,参数1,参数2...)
invoke 可以调用私有方法
//案例:
Class cls = Class.forName(new Scanner(System.in).nextLine());
//1.找到demo方法
//Class提供了根据方法签名找到指定的方法信息的AP[
String name = "demo";//方法名
//类型列表Class[]
//String.class表示字符串类型
//int.class表示int类型
Class[] types={String.class,int.class};
Class[] types1={String.class};
//根据方法签名在cls查找方法信息
Method method =
cls.getDeclaredMethod(name,types);
System.out.println(method);
method.setAccessible(true);
Object obj = cls.newInstance();
Object v = method.invoke(obj,"rr",11);
System.out.println(v);
###反射用途
IDEA
junit
spring
注解
@Retention(RetentionPolicy.RUNTIME/CLASS/SOURCE)