1.是JAVA API,是java提供的现成的类
2.是java提供的动态执行机制,动态加载类,动态创建对象,动态访问属性,动态调用方法
##静态、动态
静态:事先约定的规则,执行期间按照固定规则执行
动态:事先没有约定,在执行期间动态执行规则。
JAVA中的静态执行:编译已经就确定执行顺序(执行次序),在运行期间按照编译结果顺序执行
package reflect;
public class Foo {
public Foo() {
System.out.println("Foo()");
}
private void plus(String string,int i) {
System.out.println(1111);
}
public void plus1() {
System.out.println("111");
}
public void plus2() {
int i=0;
System.out.println("2222");
}
public void plus3() {
int i=0;
System.out.println("4444");
}
public void test111() {
System.out.println("test");
}
}
Foo foo=new Foo();
foo.plus();
JAVA中的动态执行:在运行期间才能确定加载哪些类,创建那些对象,执行哪些方法。。。。
###动态加载类
java提供了动态加载类的API:Class cls = Class.forName(类名);
Class cls = Class.forName("reflect.Foo");
forName()的参数可以通过变量传入,此时就变成一个动态加载过程:
Scanner scann=new Scanner(System.in);
String clsname=scann.nextLine();
Class class1=Class.forName(clsname);
###动态创建对象:cls.newInstance();
Object obj = cls.newInstance();
执行cls引用的类信息中的无参数构造器,动态创建实例。如果类中没有无参构造器,则抛出异常!
>>>反射可以调用有参构造器,麻烦一点。
###动态获取类的方法信息:cls.getDeclaredMethods
Method[] me=class1.getDeclaredMethods();
业务需求:执行某个类中全部的以test为开头的无参数无返回值的非静态方法。
if(method.getName().startsWith("test")&&method.getParameterCount()==0&&
method.getReturnType().toString().equals("void")) {
System.out.println("找到l:"+method);
}
###动态执行非私有方法:method.invoke(执行方法的对象,传递的参数)(没有参数时,不写值)
在invoke方法执行时候,必须传递包含当前方法的对象!!!
method.invoke(obj);
###动态执行私有方法:我们首先需要知道私有方法的方法签名,即方法名name和参数列表Class[] types,我们用一个Class类型的数组表示参数列表,然后我们获取方法信息,然后使用setAccessible(true)打开方法执行权限,然后执行。
package reflect;
import java.lang.reflect.Method;
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner scann=new Scanner(System.in);
String clsname=scann.nextLine();
try {
Class class1=Class.forName(clsname);
//Class 提供了根据方法签名找到方法信息的API
String name="plus";
//类型列表 Class[]
//String.class 表示字符串类型
//任何.class 表示任何类型
Class[] types= {String.class,int.class };
//根据方法签名在cls查找方法信息(无论方法是公有还是私有的)
Method method=class1.getDeclaredMethod(name, types);
//执行私有方法!!!!!!!!!!!!
//打开方法执行权限,违反封装
method.setAccessible(true);
Object obj=class1.newInstance();
method.invoke(obj,"aaa",1);
System.out.println(method);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}