黑马程序员_java的反射机制_01

来源:互联网 发布:linux修改inittab 编辑:程序博客网 时间:2024/05/23 11:47

<a href="http://www.itheima.com" target="blank">android</a>

<a href="http://www.itheima.com" target="blank">java培训</a>期待与您交流



          Java作为改变计算机世界的语言,其有一些特性是其他高级程序设计语言所不具备的,java的反射就是其中之一。ReflectionJava 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。 Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal或者 C++ 中就没有办法在程序中获得函数定义相关的信息。类是java反射的基础,反射就是把java类中的各种成分映射成相应的java类,java中的类是描述其他实物的,但是java类本身也是一个对象,Class文件就是描述java类的,可以通过得到一个java类的Class文件来实例化对应的类的对象。

 

一,先上代码(基本操作)

package com.itheima;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class JavaReclaction {
public static void main(String[] args) throws Exception{
Demo demo = new Demo();
//-------- 获取class文件的三种方式-------------------------------------
Class demo1 = null;
Class demo2 = null;
Class demo3 = null;

demo1 = demo.getClass();
demo2 = Class.forName("com.itheima.Demo");
demo3 = Demo.class;
System.out.println(demo1.getName()+"/"+demo2.getName()+"/"+demo3.getName());

//----------获取父类的名称---------------------------------------
System.out.println(demo.getClass().getSuperclass().getName());


//---------通过Class实例化其他对象,默认newInstance()调用无参构造-------------------------
Class demo4 = Class.forName("com.itheima.College");
College c = (College)demo4.newInstance();
c.setAge(20);
c.setName("小明");
System.out.println(c);
//---------通过Class调用其他类中(有参构造函数)-----------------
//---------java.lang.IllegalArgumentException,抛出的异常表明向方法传递了一个不合法或不正确的参数-----------------------
Constructor<?> cons[] = Class.forName("com.itheima.College").getConstructors();

//------获取构造函数-----------------
System.out.println(cons[0]+""+cons[1]+cons.length);
//------获取修饰符-----------------
int mo = cons[0].getModifiers();
System.out.println(Modifier.toString(mo));

College c1 = (College)cons[0].newInstance("hellow",20);
College c2 = (College)cons[1].newInstance("hellow");
System.out.println(c1+""+c2);
//-----------获取其他类的全部属性-----------------------------
Class demo5 = Class.forName("com.itheima.College");
Field[] field = demo5.getDeclaredFields();
for(int i = 0;i<field.length;i++){
int m = field[i].getModifiers();
String ss = Modifier.toString(m);
//-----返回字段的类型----------------
Class type = field[i].getType();
System.out.println(ss+" "+type.getName()+" "+field[i].getName());
}
//-----获取方法(指定名称)---------------
Method method = demo5.getMethod("getName");
System.out.println(method.toString());
//-----过反射取得并修改数组的信息-----------------
int[] temp = {1,2,3,4,5};
Class demo6 = temp.getClass().getComponentType();
System.out.println("获取数组类型"+demo6.getName());
System.out.println("获取数组长度"+Array.getLength(temp));
System.out.println("获取数组的第一个元素"+Array.get(temp, 0));
Array.set(temp, 0, 100);
System.out.println("修改之后数组第一个元素为: "+Array.get(temp, 0));
}
}
class Demo extends JavaReclaction{}
class College{
private String name;
private int age;
College(){}
public College(String name){
this.name = name;
}
 public College(String name,int age){
this.name = name;
this.age = age;
 }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return "["+this.name+" "+this.age+"]";
}
}

二,反射的应用---反射应用于“工厂设计模式”的案例

2.1先来看看,如果不用反射的时候,的工厂模式吧当有新的“水果”加进来时就必须要修改工厂类里的代码      了,如果我们添加太多的子类的时候,改的就会很多。


2.2当我们利用反射技术时利用反射机制(只要新的类被定义出来,就一定会有Class文件)那么就不需要修改         工厂里面的代码了,也不用担心子类过多修改的过多。只要利用Class.forName("XXX")找到指定类的字节          码文件就可以初始化我们想要的类。现在就算我们添加任意多个子类的时候,工厂类就不需要修改。


上面的代码虽然可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。


2.3

结合属性文件的工厂模式

首先创建一个fruit.properties的资源文件

内容为:apple= Reflect.Apple

              orange=Reflect.Orange


操作属性文件类


这样就可以在配置文件里看见全部的接口的子类,而且也不需要“键入完整的类的包名”。

由此可见java反射的机制还是带来了很多的方便之处。

----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima



 

 

0 0
原创粉丝点击