⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 day07.txt

📁 达内科技上课的 java学习笔记 分为18天学完
💻 TXT
字号:
                   CoreJava(day07)  2007-12-11   --- 李艳

反射:
	简介:struts,Hibernate,spring这三种框架统称为ssh,这三种框架都是用.xml作配置文件的,利用的就是反射机制。
	      反射有用,但我们用反射的机会不多,因为大部分用到反射的时候别人都已经写好了。

	反射的作用:java 1.4以前反射是不被推举技术,因为当时性能差。
		    从1.4开始sun公司把反射的机制作了很大的优化,性能上不再有问题,从此反射成为程序员可用的武器。

	反射的应用:平时不写反射,当想动态的生成执行代码时就会用到反射。

		    动态生成代码:类,对象,方法

	我们的要求:能够做到动态生成对象,动态调用方法

	用的最多的类的反射

	 class(类)是抽象、概念上的定义。object(对象)是个体、实例化。

	java.lang.Class(类): 是Object的子类。Class是一个类。对应类里的所有信息。

		用反射的眼光看String类:1、class---API信息(是一个对象) 2、object-----可以调用任意方法(是一个对象)

		每一个类都含有两个对象(class对象,object对象)
		
		int(对象)--->class(封装类)    封装类.TYPE-------例 Integer.TYPE

		当getXXX时,取得的所有都是public(允许继承),private不行。
		例: public Field[] getFields()throws SecurityException  

		方法名加Declared的就会把private的和public的都取到

		需要记的方法:1、class--->public static Class<?> forName(String className) throws ClassNotFoundException

			2、get系列:可以取属性、方法、构造器、父类、修饰符

			   取方法的:public Field getDeclaredField(String name) throws NoSuchFieldException,SecurityException
				     public Field[] getDeclaredFields() throws SecurityException
				    只获得public的属性
			3、newInstnce()(类对象调用,调用无参的构造器)---->类对象---->普通对象,若没有无参构造器就会出错。

  常用的:
     java.lang.reflect.Field(属性):
		public Class<?> getType()  不管是否是private的
		
    java.lang.reflect.Method(方法):
		public Object invoke(Object obj,Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException
	
    java.lang.reflect.Constructor(构造器):
	  public T newInstance(Object... initargs)throws InstantiationException,IllegalAccessException,IllegalArgumentException,InvocationTargetException

  基本不用:java.lang.reflect.Array(数组):

	
	获得类对象(class)的三种途径:(课堂代码:TestClass.java)
		1、Class c1=Class.forName(“java.lang.Integer”)  //输入全类名,包名、类名都要有,即使import了也不能少包名 
		
		2、String s1="abc";
		   Class c2=s1.getClass(); //所有先有对象的都可以getClass();

		3、Class c3=Integer.TYPE; //所有简单类型对应类对象只有一个

	获得属性会破坏封装:(课堂代码:TestField.java,Person.java)


	获得构造器:(课堂代码:TestCon.java,Person.java)

	
	如何动态的构造对象:(课堂代码:UseCon.java,Person.java)

		先要选定构造器,再创建实例

	获得方法:(课堂代码:TestMethod.java,Person.java)

		public Method[] getDeclaredMethods()throws SecurityException
		public Method[] getMethods() throws SecurityException
		public Method getMethod(String name,Class... parameterTypes)throws NoSuchMethodException,SecurityException
			Class...是5.0的新特性,也可以传数组的。1.4及以前都必须传数组的。

	动态调用方法:(课堂代码:UseMethod.java,Person.java)

		public Object invoke(Object obj, Object... args)throws IllegalAccessException,IllegalArgumentException,InvocationTargetException

	练习动态生成代码:(课堂代码:TestAuto.java,Person.java)
	
		for(String s:set){} //5.0新特性,可以从所有集合中取

		对象---->String 包名、类名,Object o没有所有属性
		 |
		 |
		 |
	       对象set方法
		 |
		 |
		c.getMethod(方法名.class)


	总结反射的编程步骤:
		1、利用String---->class     class.forName(String);

		2、class----->其它
		     |必
		     |须
		     |无
		     |参
		     |构
		     |造
		     |
		   实例化对象
		
		3、其它---->传参---->调用
		

内部类:
	不推崇使用内部类

	内部类的好处:可以直接操作私有属性。
	
	封装类: 
		class1{
			class2{}  //内部类
		}

	内部类的分类:		
		
	      成员式:
		      静态内部类: (课堂代码:StaticInner.java ,TestStaticInner.java) 生成的内部类的字节码文件StaticInner$Inner1.class  

				在静态内部类中只能访问外部类的静态成员。构造静态内部类对象不再需要构造外部类对象

		      成员内部类:(课堂代码:MemberInner.java ,TestMemberInner.java)
				必须要先构造外部类对象,再根据外部类对象构造内部类对象。
				生成成员内部类对象形式: Inner2 i2=new MemberInner().new Inner2();
				一个外部类对象可以生成多个成员内部类对象,一个成员内部类对象一定是由某一个外部类对象生成的。
				成员内部类不能有静态属性

				内部类和外部类的实例变量可以共存。
				在内部类中访问实例变量:this.属性
				在内部类访问外部类的实例变量:外部类名.this.属性。

				在外部访问时,外部类.内部类作声明,new 外部类(得到外部类对象).new 内部类(得到内部类对象)
					 例:MemberInner.Inner2 i2=new MemberInner().new Inner2();

	      局部式:
		      局部内部类:定义在外部类的方法中。(课堂代码:MemberInner.java)

				与局部变量类似,在局部内部类前只能用abstract或final修饰符,但一般不加此修饰符,避免对继承产生影响。其范围为定义它的代码块。

				局部内部类不仅可以访问外部类实例变量,还可以访问外部类的局部常量,但是要求外部类的局部变量是final的。
				实际上是为内部类添加了一个属性,这个属性就是外部类的final局部变量
				在类外不可直接访问局部内部类(保证局部内部类对外是不可见的)。
				在方法中才能调用其局部内部类。

		      匿名内部类: 特殊的局部内部类,用来继承一个类或者实现一个接口,我们只需要这个局部内部类的一个对象。
				  匿名内部类不能定义构造方法
				  匿名内部类在编译的时候由系统自动起名Out$1.class。
				  如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。
				  因为匿名内部类无构造方法,所以其使用范围非常的有限。

	复习前6章
		封装:private 属性
				  public 方法
				  构造器调方法
		继承:复用代码方式
					必须子类是什么父类
					共享代码,维护简单
					
					子             父

	      				继承
					类 -----------类(单个)
	    				extends

	     					实现
					类------------接口(多个)
	    				implements
	
	      				多继承
					接口----------接口(多个) 
	     					extends

	  多态:同一种东西具备多种形态
	  			1、简单多态:比如:7可以当成int,double,byte都可以
	  			2、方法多态:重写(覆盖)、重载
	  			3、参数多态(重要):依赖于简单多态和类多态,在传参的时候可以传出n种类的参数
	  			4、类多态(接口):Set set=new HashSet();
	  
	 几种实用类:
	 		Object:equals,hashCode,toString,clone
	 		String(不可改变的字符序列)
	 		StringBuffer
	 		StringBuilder
	 		
	 集合:Set,List,Map
	 
	 反射:Class,Field,Method,Constructor
	 
	 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -