反射:在程序的运行过程中,可以动态加载类,并知道类中各属性和方法。反射即把java类中的各个成分(属性,方法等)映射成一个个对象。
原理:在正常创建对象时,JVM将.class文件载入内存,然后JVM会自动创建一个class对象。
注意:
反射可以自动地创建对象,不需要new;
此时的class不是.class文件,不是关键字;
class是抽象类的类:
1.class类(class对象)用来描述普通的类;
每个类都可以有对应的class类型,如int;关键字void也有。
2.一个类只会产生一个class对象;
3.形式:
(1)object类中的getClass()返回的是对象名,对象名.getclass();
(2)class.forName(“全类名”); 全类名即路径+类名,如包名.要反射的类名,一般要抛异常。
package reflect;
public class Reflect {
public static void main(String[] args) throws Exception {
Student st=new Student();
Class c=Class.forName("reflect.Student");
System.out.println(c);
}
}
(3)类名.class;
Class c = int.class;返回构造方法:
1.返回student类中的所有构造方法:
package reflect;
import java.lang.reflect.Constructor;
public class Reflect {
public static void main(String[] args) throws Exception {
Class c=Class.forName("reflect.Student");
Constructor[] constru=c.getConstructors();//得到的是数组形式
for(Constructor con:constru){
System.out.println(con);
}
}
}
2.返回指定的构造方法:getConstructor(参数);
3、newInstance()方法:
newInstance():可建由此类对象表示的类的新实例;
c.newInstance返回的是泛型,转一下类型即可;
但是此方法只能返回无参的构造方法,当没有无参的构造方法时会报错。
得到对象后:Class c=Class.forName(“包名.student”);
st=(Student)c.newInstance();
1、以数组形式返回所有方法:(包括自带的方法)
Method[] Array=c.getMethods();
for(Method method:Array){
System.out.println(method);
}
2.获取指定的方法:
Method method=c.getMethod(“方法名”,一个或多个class对象);
3.访问私有方法:
Method pd=c.getDeclaredMethod("study2",int.calss);
pd.setAccessible(true);//访问权限中的flag设为true,才能访问私有方法
pd.invoke(st,2);
例:
public class Reflect {
public static void main(String[] args) throws Exception {
Class c=Class.forName("reflect.Student");//获取学生类的class对象
Constructor co=c.getConstructor(int.class,String.class);获取class对象的构造方法(对应int,String参数类型的)
Student st=(Student)co.newInstance(9,"xiaoming");//创建类的新实例
Method pd=c.getDeclaredMethod("study2",int.class);//获取私有方法
pd.setAccessible(true);//访问权限
pd.invoke(st,2);
}
}



