Java反射

Posted escapist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射相关的知识,希望对你有一定的参考价值。

通过反射的方法设计应用程序,提高更好的扩展性。

 

获取字节码文件对象的方式:

1. 通过Object类中的getClass方法。
    虽然通用,但是前提必须有指定类,并对该类进行对象的创建,才可以调用getClass方法。

 

2.  使用的任意数据类的一个静态成员class,所有的数据类型都具备的这一个属性。
    好处:不用new对象。但是,还需要使用具体的类。

3.  使用Class类中的forName方法。通过给定类名来获取对应的字节码文件对象。
     只要知道类的名字就可以了。获取对应的字节码文件直接由forName方法自动完成。
这就是反射技术使用的获取字节码文件对象的方式。

 

通过newInstance()就可以创建字节码对象所表示的类的实例。

通过new创建给定的类的实例。
调用该类的构造函数。
  * 通常被反射的类都会有提供空参数的构造函数。
  * 如果没有对应的构造函数,会报  InstantiationException
  * 如果有提供,但是权限不够,会报 lllegalAccessException

Person p = new Person();
加载Person类,并将Person类封装成字节码文件对象。
通过new创建Person对象。
调用构造函数对对象初始化。

 

如果要通过指定的构造函数初始化对象怎么办呢?

1. 获取字节码文件对象。
2. 获取给定的构造函数。
3. 通过构造函数初始化对象。

public static void getConstructorDemo() throws Exception {
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);
        
        //获取指定的构造器。获取Person类中两个参数string,int的构造函数。
        Constructor cons = clazz.getConstructor(String.class,int.class);
        
        //有了构造器对象后,通过构造器对象来初始化给类对象。
        Object obj = cons.newInstance("wangwu",23);
        //Person p = new Person("lisi",21);  
}

 

获取字段

public static void getFieldDemo() throws Exception {
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);
        
        String fieldName = "age";
        
        //获取age字段对象。
//        Field field = clazz.getField(fieldName);//获取是公共的字段。
        Field field = clazz.getDeclaredField(fieldName);
        
//        getXXX:获取都是类中公共的成员。
//        getDeclaredXXX:获取本类中已有的成员。
//        System.out.println(field);
        
        //对其进行值的设置,必须先有对象。
        Object obj = clazz.newInstance();
        
        //通过查找父类AccessiableObject的方法。setAccessiable(true);
        field.setAccessible(true);//取消权限检查,暴力访问。一般不访问私有。
        field.set(obj, 30);//IllegalAccessException:age字段是私有的。
        
        System.out.println(field.get(obj));
    }

获取方法

public static void getMethodDemo2() throws Exception {    
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);
        String methodName = "staticShow";    
        Method method = clazz.getMethod(methodName, null); // 第1个参数后面都是 返回值类型
        method.invoke(null, null);  对象设置为 null 
    }

    public static void getMethodDemo() throws Exception {
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);    
        String methodName = "show";   
        Method method = clazz.getMethod(methodName, String.class,int.class);
        Object obj = clazz.newInstance();
        method.invoke(obj, "wangcai",20);   实例方法要手动传入 对象
    }

 














以上是关于Java反射的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

反射机制入门

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

OpenGL片段着色器不照亮场景