------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
高新技术——反射
什么是反射?
反射是指可以获取正在运行的Java对象,可以知道一个类的所有属性和方法,可以调用它的任一个方法等。
以一个小例子进行入门:
获取类名及类的类型
代码如下:
public class Demo{
public static void main(String[] args){
Class cls = String.class;
System.out.println("类名:" + cls.getName());
System.out.println("是否为接口:" + cls.isInterface());
System.out.println("是否为基本数据类型:" + cls.isPrimitive());
System.out.println("是否为数组对象:" + cls.isArray());
System.out.println("父类名:" + cls.getSuperclass().getName());
}
}
打印结果:
类名:java.lang.String
是否为接口:false
是否为基本数据类型:false
是否为数组对象:false
父类名:java.lang.Object
由上面的打印结果,我们可以获取一个类及其父类所属的包和类名,还可以获取该类的类型。由此可见,功能非常强大。
Class.forName()实现动态加载类
我们可以使用Class.forName()方法实现动态加载类,可用字符串指定类名称来获得类相关信息。如:
public class Demo{
public static void main(String[] args) throws Exception{
Class cls = Class.forName("java.lang.String");
System.out.println("类名:" + cls.getName());
}
}
打印结果:
类名:java.lang.String
如果Class.forName()方法中的类不存在,则抛出异常。
获取其它类的属性及调用其它类的方法
定义两个类,可以通过一个类获取另一个类的属性或调用另一个类的方法,举个例子:
Student类:
public class Student {
private String name;
Student(){}
Student(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
Demo类:
import java.lang.reflect.*;
class Demo {
public static void main(String[] args) throws Exception {
Class<?> demo = null;
Object obj = null;
demo = Class.forName("Student");
obj = demo.newInstance();
//获取Student类的属性
Field field = demo.getDeclaredField("name");
field.setAccessible(true);
field.set(obj, "Tom");
System.out.println("获取属性:name = "+field.get(obj));
//调用Student类的方法
Method setter = demo.getMethod("setName", String.class);
setter.invoke(obj, "Jack");
Method getter = demo.getMethod("getName");
System.out.println("调用方法:name = "+getter.invoke(obj));
}
}
打印结果:
获取属性:name =Tom
调用方法:name =Jack