首页 > 编程知识 正文

java序列化,java中的继承机制是什么

时间:2023-05-03 07:12:33 阅读:162684 作者:819

当我们面对新知识的时候,我们往往需要了解三个方面。 那是什么,那能做什么,那比原来的知识更强的是哪里,我们应该怎么使用它? 当开放的天空能解决这些问题的时候,意味着你已经入门了这个知识。

一、什么

Java Reflaction in Action中有这样的话。 我可以解释。 反射是执行中的程序检查自己和软件的执行环境的能力,可以根据发现进行变更。 一般来说,反射可以根据运行时指定的类名获得类的信息。

二、为什么

为什么我们要用反射,它的作用是什么,在实际编程中有什么应用?

首先,明确静态编译和动态编译这两个概念。

静态编译:在编译时确定类型并绑定对象。 也就是说要通过。

动态编译:在运行时确定类型并绑定对象。 动态编译最大限度地发挥了java的灵活性,展示了很多

状态的应用具有降低类间耦合性的效果。

虽然可以清楚地看到动态编译的好处,但是反射是使用动态编译创建对象。

那么,实际反射有什么好处呢?

对比往往能更直观地体现出两者的不同。

从一个代码示例开始说明。 (应用博文的一个例子,http://blog.csdn.net/just doit _ potato/article/details/51011843 ) )。

如果不反射,就会变成这样

界面浮{

publicabstractvoideat (;

}

classAppleimplementsfruit{

公共void eat

system.out.println(apple );

}

}

classOrangeimplementsfruit{

公共void eat

system.out.println(Orange );

}

}

//建立工厂类

//也就是说,以后我们追加其他实例的时候修改工厂类就可以了

类工厂{

publicstaticfruitgetinstance (字符串框架名称)。

fruitf=null;

if(apple ).equals(fruitname ) }

f=newApple (;

}

if(Orange ).equals (fruit name ) ) )。

f=newOrange (;

}

返回;

}

}

classhello{

publicstaticvoidmain(string[]a ) {

fruitf=factory.getinstance (orange );

f.eat (;

}

}

每次尝试添加新的水果时,我们都必须更改Factory的源代码,你会发现更改原来正确的代码是非常危险的行为。 而且随着水果种类的增加,你会发现你的factory类越来越肥大。

这不得不说是非常---的做法。 (初学者可能会问,为什么我们不直接用main方法new水果呢? 我们可能需要用getInstance方法做别的事情。 所以直接new;

反射无疑是查看代码的聪明方法。

界面流{ publicabstractvoideat (;

} classappleimplementsfruit { public void eat (

system.out.println(apple );

}

} classorangeimplementsfruit { public void eat (

system.out.println(Orange );

}

} class factory { publicstaticfruitgetinstance (string class name ) }

fruitf=null; try{

f=(fruit ) class.forname(classname ).newInstance );

}catch(exceptione ) {

e .打印任务跟踪(;

}returnf;

}

} class hello { publicstaticvoidmain (string [ ] a ) }

fruitf=factory.getinstance (reflect.apple ); if(f!=null ) {

f.eat (;

}

}

}

新品种的水果出现的时候,你

完全不用去修改原有代码。

从上面的案例中,我们可以清楚的体会到反射的优越性。

那么有的人又会问,这个例子能完全明白,但是如果放到实际的编程,应用中,我们又会在什么情况下用到反射那?

举一个看到过的例子,在实际开发中,我们需要把一个包中的class new出来,但是这个包中的类总是需要变动,那么怎么办,难道总是修改main方法中xxx=new xxx()吗。这样无疑是麻烦的。而运用反射。我们可以相应的增加一个配置文件,成就的大炮记录包中所有的类名,包中类增加时就加一个类名,删除时就删除一个类名。让main方法去读取这个配置文件中的类名,通过反射获得实例,完全不用我们去修改main方法中的代码。

反射还有什么用那?他甚至可以修改其他类中的私有属性。android开发中,我们需要改变一个私有标志位的时候,android源码并没有提供set方法,我们又不能改变源码,怎么办,反射可以完美解决这个问题。

说了这么多,那么我们的开发中,为什么不全部都用反射那?一个原因,开销,它的开销是什么昂贵的,随意尽量在最需要的地方使用反射。

三、怎么用

说完是什么,为什么,我们必然需要掌握如何使用反射,先看反射中涉及了那些方法。

Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserInfo;

Object obj=c.newInstance();//创建对象的实例

OK,有了对象就什么都好办了,想要什么信息就有什么信息了。

获得构造函数的方法

Constructor getConstructor(Class[] params)//根据指定参数获得public构造器

Constructor[] getConstructors()//获得public的所有构造器

Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器

Constructor[] getDeclaredConstructors()//获得public的所有构造器

获得类方法的方法

Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法

Method[] getMethods()//获得所有的public方法

Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法

Method[] getDeclaredMethods()//获得所以的public和非public方法

获得类中属性的方法

Field getField(String name)//根据变量名得到相应的public变量

Field[] getFields()//获得类中所以public的方法

Field getDeclaredField(String name)//根据方法名获得public和非public变量

Field[] getDeclaredFields()//获得类中所有的public和非public方法

看到这些方法,你就可以明白,反射是多么的强大了,开放的天空正确使用这些方法的时候,基本上是掌握了反射的技巧。

参考博文:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。