反射
   JAVA反射机制是在运行状态中,
   对于任意一个类,都能够知道这个类的所有属性的方法;
   对于任意一个对象,都能够调用它的任意一个方法和属性;
   这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的发射机制
   动态获取类中信息,就是JAVA反射,可以理解为对类的解剖。
…
Class:字节码文件类
- 想要获得一个类的Class对象,有三种方法
//////////////////////////////////////////////////////////////////////////
//1.Object类中的getClass()方法的
//想要用这种方式,必须要明确具体的类,并创建对象。
public static void getClassObject1 ()
{
}Student p = new Student(); Class class1 = p.getClass();
//////////////////////////////////////////////////////////////////////////
//2.任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
//相对1来说更简单,但还是需要明确用到类中的静态成员。
private static void getClassObject2 ()
{
}Class class2 = Student.class;
////////////////////////////////////////////////////////////////////////////
//3.只要通过给定的类的字符串名称就可以获取该类,更为扩展
//可以用Class类中的方法完成,该方法就是forName
public static void getClassObject3 ()
{
}String className = "test.Student"; Class class3 = null; try { //找寻该名称类文件,并加载进内存,并产生Class对象 class3 = Class.forName(className); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(class3);
//上边的方法是空参构造方法,如果必须要传递参数,就使用Constructor获取该类的构造函数对象
public static void getClassObject3_2 ()
{
}String className = "test.Student"; Class class3 = null; try { class3 = Class.forName(className); Constructor cons = class3.getConstructor(String.class,int.class);// 类型.Class 代表该数据类型的Class对象 Object obj = cons.newInstance("王五",20); } catch (Exception e) { e.printStackTrace(); } System.out.println(class3); 
字段的获取
getField():该方法返回一个类或接口的一个公共成员字段
getFields():该方法返回一个类或接口的所有公共成员字段
getDeclaredField():返回包括公共和私有的字段,但不包括继承的字段
getDeclaredFields():返回所有。。。。。
//4.如何获取字段
    public static void getFidldDemo()
    {
        String classname = “test.Student”;
        Class class4 = null;
        Field f1 = null;
        Field f2 = null;
        try {
            class4 = Class.forName(classname);
            //f1 = class4.getField(“name”);//获取共有的字段
            f2 = class4.getDeclaredField(“age”);//获取私有的字段
            f2.setAccessible(true);//对私有字段的暴力访问
            Object obj = class4.newInstance();
            f2.set(obj,20);
            Object o = f2.get(obj);
            System.out.println(o);
    }catch (Exception e){
        e.printStackTrace();
    }
}
函数的获取
getMethod():获取一个方法
getMethods():获取所有方法
invoke():执行方法
//函数的使用
//1.无参函数的使用
        Method me1 = class5.getMethod("showName");
        Constructor c = class5.getConstructor(String.class,int.class);
        Object obj = c.newInstance("哈哈",12);
        me1.invoke(obj,null);//这里的null是无参
//2.有参函数的使用
        Method me2 = class5.getMethod("show",String.class);//在此处加上参数的class类
        Object o = class5.newInstance();
        me2.invoke(o,"嘿嘿");