java基础之Gui编程和反射

来源:互联网 发布:热传导 软件 编辑:程序博客网 时间:2024/05/29 13:25
1.GUI 即图形用户界面
也就是应用程序提供个给用户操作的图形界面;包括窗口,菜单,按钮,工具栏和其他各种图形界面元素。

java 针对 GUI提供了类分别位于 java.awt 和 javax.swing 包中,简称 AWT 和 Swing。

2. 类初始化时机:

创建类的实例;

访问类的静态变量,或者为静态变量赋值;

调用类的静态方法;

使用反射方式来强制创建某个类或接口对应的 java.lang.Class 对象;

初始化某个类的子类;

直接使用 java.exe 命令来运行某个主类;

3. 类加载器:

Bootstrap ClassLoader 根类加载器:被称之为引导类加载器,负责 java 核心类的加载;比如 System , String 等;在 JDK 的 lib 目录下的 jr.jar 文件中;

Extension ClassLoader 扩展类加载器: 扩展类加载器,负责 JDK 的扩展目录中 jar 包的加载。在 JDK 的 lib 目录下的 ext 文件中;

System ClassLoader 系统类加载器:负责在 JVM 启动时来加载来自 java 命令的 class 文件,以及环境变量和 classPath 所指定的类路径和包;

4. 反射: java 的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都可以调用它的任意一个属性或者方法;这种动态的获取类的属性
以及动态调用类的方法的功能称为 java 的反射机制。

JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制。

    动态获取类中信息,就是java反射。可以理解为对类的解剖。

    如果想要对指定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了反射技术。

    所谓的框架就是对外提供一些接口,也就是功能扩展的标准,由实现类按照这个接口标准去实现。框架内部如果需要操纵这些实现类的对象完成某些操作,那么只需要把这些实现类的全名(包名+类名)写在某个配置文件中,框架代码只需要读取这个配置文件,就可以获取这个实现类的字节码文件,然后利用反射技术创建这个实现类的对象并且调用相应的方法完成一些操作。

    用于描述字节码的类就是Class类,创建对象,可以提取字节码文件中的内容,如字段、构造函数、一般函数。该类就可以获取字节码文件中的所有内容,那么反射就是依靠该类完成的。想要对一个类文件进行解剖,只要获取到该类的字节码文件对象即可。

5. 获取 Class 对象的三种方式:
1.使用 Objeect 类的 getClass() 方法; 例如: Person p = new Person();Class cla = p.getClass();

2.通过数据类型的静态属性 class  例如: Class cla = Person.class;

3.Class 类中的静态方法 public static class<?> void forName( String name){}  例如:Class cla = Class.forName( "UserClass.Person");

6. 通过反射获取构造函数:
当获取得到 Class 对象后,可以通过 getConstructor() 和 getDeclaredConstructor() 来获取类中的构造函数,同时也要根据构造函数的参数来传入相应的参数。

注意这两个方法的区别:当构造函数为非 public  的时候,使用后者来获取;其他情况下一般使用前者。

具体代码例如:
Class cla = Class.forName( "UserClass.Person");
Constructor cons = cla.getConstructor();

7. 通过反射获取成员变量:
通过 getField() 和 getDeclaredField() 来获取类中的字段,方法中的参数为想要获取的 field 字段。

两者的区别与 getConstructor() 和 getDeclaredConstructor() 的区别类似,当字段为非 public 修饰的时候,使用后者来获取。

具体代码如下:
Class cla = Class.forName( "UserClass.Person");
Field personName = cla.getField( "personName");

8. 通过反射获取成员方法:
通过 getMethod() 和 getDeclaredMethod() 来获取类中的成员方法,方法中的参数顺序为:成员方法名 , 成员方法中使用的参数(没有则不输入)。

两者的区别:getDeclaredMethod() 能获取非 public 成员方法。

具体代码如下:

Class cla = Class.forName( "UserClass.Person");
Method personMethod = cla.getMethod( "personMethod");

9. 利用反射来使用配置文件,自己练习的代码如下:

public void functionOne() throws Exception{

FileReader fr = new FileReader( "class.txt");
Properties pp = new Properties();
pp.load( fr);
fr.close();

String className = pp.getProperty( "className");
Stirng method = pp.getProperty( "method");

Class cla = Class.forName( className);
Constructor cons = cla.getConstructor();
Object obj = cons.newInstance();

Method methodShow = cla.getMethod( method);
methodShow.invoke( obj);
}

以下为 class.txt 文件内容:
className=UserClass.Student
method=show

输出结果为: I am Teacher!!!

10. 在 List< Integer> list = new ArrayList< Integer>(); 中添加 字符串对象,自己练习的代码如下:

public void functionTwo(){

List< Integer> list = new ArrayList< Integer>();
list.add( 123);

Class cla = Class.forName( ArrayList);
Method methodAdd = cla.getMethod( "add" , Object.class);
methodAdd.invoke( list , "xiaoTian");
methodAdd.invoke( list , "xiaoMing");

for( Iterator it = list.iterator ; it.hasNext() ; )
{
System.out.println( it.next());
}
}

输出结果为: 
123
xiaoTian
xiaoMing
0 0
原创粉丝点击