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)