黑马程序员_反射技术

---------------------- android培训 、 java培训 、 期待与您交流! ----------------------


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值