首先,让我们来谈谈反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能成为java语言的反射机制。
光说不练假把式,那就写个例子吧 :
题目1:运行Robot类中的方法
public class Robot {
private String name;
public void sayHello(String str){
System.out.println(str + " " + name);
}
private String throwHello(String str){
return "Hello" + str;
}
}
```java
public class ReflectSample {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
//获取对象
Class cls = Class.forName("reflect.Robot");
//创建实例对象
Robot r = (Robot)cls.newInstance();
//根据方法名获取方法
Method getHello = cls.getDeclaredMethod("throwHello", String.class);
//设置为true可访问私有方法
getHello.setAccessible(true);
//invoke运行该方法
Object str = getHello.invoke(r,"Bob");
System.out.println("getHello result is " + str);
Method sayHello = cls.getMethod("sayHello", String.class);
Object obj = sayHello.invoke(r,"阿飞");
System.out.println("sayHello result is " + obj);
//获取name字段
Field name = cls.getDeclaredField("name");
//因为为私有所以 Accessible设置为true
name.setAccessible(true);
//将name赋值为梨子果果
name.set(r,"梨子果果");
sayHello.invoke(r,"阿飞");
}
}
结果:
题目2:写一个可以在控制台输入类名,动态获取类和类中方法的实例。
```java
public class TestCase {
public void testHello(){
System.out.println("Hello");
}
public void testWho(){
System.out.println("Who");
}
public void demo() {
System.out.println("demo");
}
}
public class Demo02 {
public static void main(String[] args) throws Exception{
/**
* 动态加载类,并且动态创建对象
* 如下代码可以动态加载任何的类,创建其对象
* 注意:类型必须有无参数构造器
*/
Scanner in = new Scanner(System.in);
//运行期间通过控制台读取类名
System.out.print("输入类名:");
String className=in.nextLine();
//动态加载类到方法区,类名错误时候抛异常
Class cls = Class.forName(className);
//显示加载的结果
System.out.println(cls);
//动态创建对象,如果没有无参数构造器时抛异常
Object obj = cls.newInstance(); //Foo
//显示创建好的对象
System.out.println(obj);
//动态输入方法名
System.out.print("输入方法名:");
String methodName = in.nextLine(); //test
//根据方法名动态查找方法method
//getDeclaredMethod 根据给定的方法名查找,不管是不是私有的;不能获取继承、实现的方法
//一个方法,返回值是一个方法。如果没有找到抛异常
//getMethod只能获取该类上的public方法,但是能获取继承、实现的方法
Method method=
cls.getDeclaredMethod(methodName);
//开启方法的访问权限,用来访问私有方法
method.setAccessible(true);
//动态执行方法, obj 对象上一定要包含指定的方法!
Object val= method.invoke(obj);
//val 是方法的返回值,如果没有返回值则为null
System.out.println(val);
}
}
结果: