Java基础--反射

1, 反射:就是把java类中各种成分映射成相应的java类。

字节码:字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。
要学的方法,Class,Field,Method, Constructor, Package。。。
Method代表一个类中方法的类型,
Class是一个类,Class类代表java类。
没有构造方法,不能new对象。
Class cls1 = 字节码1;
Class cls2 = Date.class;

Person p1;
p1.getClass();//得到字节码
Class.forName("java.lang.String");//返回字节码

三种方式获得字节码:
1,类名.class,如System.class
2,对象.getClass(),如new Date().getClass();
3,Class.forName("类名"),如 Class.forName("java.util.Date");
通常用第三种,源程序不需要知道类名,运行时传入参数获取。

九个预定义的.class,包括八种基本数据类型和void类型。
String str1 = "abc";
Class cls1 = str1.getClass();
Class cls2 = Stirng.class();
Class cls3 = Class.forName("java.lang.String");

这三个是同一份字节码。 

isPrimitive()判断是否是基本类型,
cls1.isPrimitive();
九种预定义Class实例对象,int.class == Integer.Type
数组类型的Class实例对象,Class.isArray()

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

2,反射用的方法

获取类的构造方法:
Constructor类,代表某个类中的一个构造方法。
Constructor[] constructors = Class.forName("java.lang.String").getConstuctor()
Ex. 
Constructor cons1 = String.class.getConstructor(StringBuffer.class);
String str2 = (String)cons1.newInstance(new StringBuffer("abc"));

ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldy = pt1.getClass().getField("y");
Fieldy.get(pt1);//这样取出的就是pt1中的参数5.
对于private变量可用getDeclaredField("x");
取出用fieldx.setAccessible(true);然后再取。

同一份字节码的比较用==比。(field.getType() == String.class())

Method:方法的反射。
Method methodCharAt = String.class.getMethod("charAt", int.class);
methodCharAt.invoke(str, 1);如果此处str为null,那么调用的是静态方法。

数组的反射,
具有相同维数和元素类型的数组属于同一类型
反射的应用,写框架。

应用的例子,主体部分
    Properties props = new Properties();  
        InputStream ips = new FileInputStream("config.properties");

        props.load(ips);  
        ips.close();  

        String className = props.getProperty("className");  
        Collection collections = (Collection)Class.forName(className).newInstance();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章