1、反射机制:对一个类进行动态的获取并创建对象,并调用该类中的内容。
2、应用程序
1.在不明白日后出现什么样的实现类时,可以扩展出去,对外提供配置文件,让后期的实现类都定义在配置文件中。
2.该程序中会读取配置文件并根据指定的名字找寻具体对应的类。
3.对找到的类进行对象的建立。
4.并调用该类对象的成员。
是不是在动态的获取指定的类,是!
是不是在调用类中的成员。
这就是反射技术。
3、用于描述字节码文件的类名称就是Class
4、只要获取到字节码文件对象。就可以获取该字节码中所有的内容
这就是动态的获取类中的内容,并使用
如何获取到字节码文件对象呢?
5、反射机制:对一个类进行动态的获取并创建对象,并调用该类中的内容。
获取字节码文件对象的方式。
方式一:对象调用 使用Object类中的getclass方法。
该方式必须先创建未知类的对象,再调用getclass方法。
public static void getClassDemo1() {
Person p1 = new Person();
Person p2 = new Person();
Class clazz1 = p1.getClass();
Class clazz2 = p2.getClass();
System.out.println(clazz1 == clazz2);
}
------------------------------------------------------------------------
方式二:类名调用 使用静态的class属性就可以获取
Class clazz=Person.class;
该方式还是需要使用未知的类。
------------------------------------------------------------------------
方式三:通过Class类中的静态方法forName(className)完成;
爽!只要通过类名就可以获取到对应的字节码文件对象。这种方式的扩展性是最好的。
forName:1.根据传入的类的名称,自动去classPath路径下去寻找与该类名称相同的类文件。
2.通过加载器将该类进行加载,并在内存中生成该类的字节码文件对象。
/**
* 方式三:
* @throws ClassNotFoundException
*/
public static void getClassDemo3() throws ClassNotFoundException {
String className = "cn.itcast.bean.Person";// 注意名称是全名
Class clazz = Class.forName(className);// 放射机制的基本核心
System.out.println(clazz);
}
6、 字段的获取设置
AccessibleObject 取消权限检查
public static void getFieldDemo() throws ClassNotFoundException,
NoSuchFieldException, SecurityException, InstantiationException,
IllegalAccessException {
String className = "cn.itcast.bean.Person";
/*
* 获取指定类中的指定名称的字段 思路: 1.通过类名获取字节码文件对象 2.通过字节码文件对象获取其中的成员字段。
*/
// 1.获取字节码文件对象
Class clazz = Class.forName(className);
// 2.通过Class对象的方法获取字段。
// Field field = clazz.getField("age");// 只能获取公共的字段
Field field = clazz.getDeclaredField("age");
Object obj = clazz.newInstance();
// 取消权限检查
field.setAccessible(true);// 暴力访问,不建议此方法访问
// 对字段进行值得设置,需要使用字段对象来完成
field.set(obj, 30);
System.out.println(field.get(obj));
System.out.println(field);
}
7、 获取构造器
public static void getConstructorDemo() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
String className="cn.itcast.bean.Person";
Class clazz=Class.forName(className);
//之前通过newInstance进行指定类的实例化。但是该类中如果没有空参数构造函数呢?
//或者想通过指定的构造函数进行该类对象实例化呢?
/*
* 1.必须先要获取指定的构造函数。
* 2.通过获取到的构造函数对对象进行初始化。
*/
//1.获取构造器对象
Constructor constructor=clazz.getConstructor(String.class,int.class);
//2.如何初始化,构造器最清楚
Object obj=constructor.newInstance("lisi",20);
}
8、 获取方法。获取公有,空参数的方法;
public static void getMethodDemo() throws Exception {
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
//获取指定类中的指定的方法
Method method =clazz.getMethod("show", null);
//获取指定的对象
Object obj=clazz.newInstance();
//调用方法对象的invoke方法。
method.invoke(obj, null);
}
---------------------- android培训 、 java培训 、 期待与您交流! ---------------------- 详细请查看:www.itheima.com