---------------------- ASP.Net+Android+IOS开发</a>、.Net培训、期待与您交流! ----------------------
java是面向对象的语言,我们写的类编译成class字节码文件后也是一个对象,这个对象在java中用Class描述。
反射可以将java里一个类中的成员(变量,方法)映射成java里的对象。(Field、Constructor、Method)。
在JAVA运行环境中,对于任意一个类,可以获取到这个类的属性和方法。对于任意一个对象,可以调用它的任意一个方法。(ssy)
同时,反射可以通过setAccessible(true)跳过安全检查,访问到类中的私有成员。
通过反射创建对象:
class Singleton {
public final static Singleton instance = new Singleton();
private Singleton(){}
}
public class ReflectTest {
public static void main(String[] args)throws Exception {
Singleton s1 = Singleton.instance;
Class clazz = Singleton.class; //得到类的字节码对象
Constructor c = clazz.getDeclaredConstructor(); //通过字节码对象得到构造方法
c.setAccessible(true); //因为构造方法是私有的,设置跳过安全性检查
Singleton s2 = (Singleton) c.newInstance(); //调用构造方法创建对象
System.out.println(s1 == s2);
}
除了可以通过反射创建对象,还可通过反射调用对象的方法:
public class ReflectTest { public static void main(String[] args) throws Exception { Person p = new Person("baby", 1); Class clazz = Person.class; //得到Person类的字节码对象 Method method = clazz.getMethod("setName", String.class); //得到setName(String name)方法 method.invoke(p, "xiaowang"); //在p对象上调用setName("xiaowang")方法 System.out.println(p); } }---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------