反射

反射

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,"嘿嘿");