黑马程序员------第16天(反射)

来源:互联网 发布:java工厂模式的好处 编辑:程序博客网 时间:2024/05/21 08:16
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

反射的深入讲解

1.     透彻分析反射的基础_Class类

a)       Class类:

java程序中各个java属于同一类事物。描述这类事物的java类名就是Class。

 

b)       函数:

String  getName( )

Package  getPackage()获得这个类所属的包

              method[]  getMethods()获得这个类中所有方法列表

              Class<T>  getInterfaces()得到自己实现的多个接口

 

c)        Class 类没有构造方法

 

例:Person p1=new Person()

        Person p2=new Person()

       Class cls1=Date.class//字节码1;

       Class cls2=Person.class//字节码2

       p1.getClass();//找到我的字节码妈妈

      

Class.forName(“java.lang.String”);

       作用:返回字节码.

       返回的方式有两种  ①这份字节码已经加载到内存中,直接返回

java虚拟机中还没有这份字节码,则用类加载器去加载

d)       计算机要使用这些二进制字节码时,要把这些文件加载到内存中,然后才创建一个一个对象。

Date  Math

如果内存中有三份字节码,那么内存里就有3个Class类的实例对象

 

e)       如何得到各个字节码对应的实例对象(三种方式):

 

1.       类名.class  例如:System.class

2.       对象.getClass()  例如:newDate().getClass()

3.       Class.forName(“类名”)  例如:Class.forName(“java.util.Date”);

 

f)        基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

 

g)       isPrimitive() 判断是否是基本类型

String是一个类,但不是基本数据类型

 

数组不是基本数据类型

总之只要是在源程序中出现的类型,都有各自的Class实例对象,例如int[]

void

2.     理解反射的概念

反射就是把java类中的各种成分映射成相应的java类。例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包,等等信息也用一个个的java的类来表示。就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来

表示他们是Filed,Method,Contructor,Package等等

3.     构造方法的反射应用

a)       Constructor类代表某个类中一个构造方法

方法:

①    getDeclaringClass()

②    int   getModifiers()

③    ObjectnewInstance() à强制转换

b)       得到某个类中所有构造方法:

例子:

Constructor[]constructors=

Class.forName(“java.lang.String”).getConstructors();

c)        得到某一个构造方法:

例子:Constructor constructor=

         Class.forName(“java.lang.String”).getConstructor(StringBuffer.class)

              ()中写明对应参数列表的Class列表

d)       反射会导致程序性能严重下降(19,21:35)

4.     成员变量的反射

a)       Fileld类代表某一个类中的成员变量

b)        

publicclass ReflectPoint {

         private int x;//在反射里

         public int y;

        

         public String str1="ball";

         public Stringstr2="basketBall";

         public String str3="itcast";

        

         public ReflectPoint(int x, int y) {

                   super();

                   this.x = x;

                   this.y = y;

         }

         public String toString()

         {

                   returnstr1+":"+str2+":"+str3;

         }

}

 

privatestatic void changeStringValue(Object obj)throws Exception

         {

                   Field[]fields=obj.getClass().getFields();//获取字节码中的所有变量

                  

                   for(Field field:fields)

                   {

                            if(field.getType()==String.class)//字节码拿等号比,因为是同一份字节码

                            {

                                     StringoldValue=(String)field.get(obj);

                                     StringnewValue=oldValue.replace('b','a');

                                     field.set(obj,newValue);

                            }

                   }

         }

 

 

changeStringValue(pt1);

         System.out.println(pt1);

5.     成员变量反射的综合案例

 

6.     成员方法的反射

a)       Method类代表某个类中的一个成员方法

b)       得到类中的某一个方法:

例子:

MethodcharAt=

Class.forName(“java,lang.String”).getMethod(“charAt”,intclass)

 

c)        调用方法:

1.        通常方式:System.out.println(str,charAt(1));

2.        反射方式:System.out.println(charAt,invoke(str,1));

 

d)       如果传递给Method对象的invoke()方法的第一个参数为null,这样意味这什么呢?说明该method对象对应是一个静态方法。

 

e)       JDK1.5和JDK1.5中invoke的区别

 

JDK1.5:public Objectinvoke(Object obj,Object…args)

JDK1.4:public Objectinvoke(Obejct obj,Object[] args)

7.     对接收数组参数的成员方法(主函数)进行反射

a)       为什么要用反射的方式调用主函数:

 

b)       目标:写一个程序,这个程序能够根据用户提供的类名,去执行类中的main方法

c)        问题:启动java程序的main方法的参数是一个字符串数组,即public staticvoid  main(String[] args),通过反射方式来调用这个main方法时,如何为ivoke()传递参数呢?

按JDK1.5的语法,整个数组是一个参数,而按照JDk1.4的语法,数组中每一个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会按照哪一种语法?向下兼容原理:

d)       解决办法:

8.     数组与Object的关系及其反射类型

9.     数组的反射应用

10.  ArrayList_HashSet的比较及Hashcode分析

 

java中有没有内存泄露吗???

就是说对象不需要再用,但是还在占用内存空间。

hashCode();

11.  框架的概念及用反射技术开发框架的原理

a)       反射的作用:框架

12.  用类加载器的方式管理资源和配置文件

a)       配置文件用类加载器加载,只读,没有outStream保存对应上面的程序

b)       配置文件一定要放在类的目录里面,

c)        直接卖可乐得了

13.  由内省引出JavaBean的讲解

a)       内省的理解:内省:IntroSpector:检查视察,对内部进行检查,主要用于javaBean进行操作,

b)       JavaBean是一个特殊的java类

1.       int        getAge()返回对象的

2.       void    setAge()

14.  对JavaBean的简单内省操作

15.  对JavaBean的复杂内省操作

 

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击