您的位置:首页 > 编程语言 > Java开发

06_Java基础_反射、正则表达式、图形界面

2015-05-09 08:40 501 查看
------- android培训java培训.net培训IOS培训
期待与您交流! -------

反射

反射的基本功能是可以获得字节码文件中的成员。

要想获得某个字节码文件中的成员,必须先获得要先获取该字节码文件的对象。

获取字节码文件对象的方法有以下几种:

1.使用类中的getClass方法。
这个方法时通用的,但是前提是该类必须已经创建了对象,才可以调用getClass方法。
2.使用任意 数据类 的一个静态成员class,这是所有的数据类型都具备的一个属性。
虽然不用new对象。但是,还需要使用具体的类。
3.使用Class类中的forName方法。通过给定类名来获取对应的字节码文件对象。
这种方式很方便,只要知道类的名字就可以了。
获取对应的字节码文件直接由forName方法自动完成。

这就是反射技术使用的获取字节码文件对象的方式。

使用forName方法获取相应的字节码文件对象

package cn.itcast.reflect.demo;

import cn.itcast.domain.Person;

public class Reflect_GetClassDemo {

public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

getClass_3();

}

public static void getClass_3() throws ClassNotFoundException, InstantiationException, IllegalAccessException {

String className = "cn.itcast.domain.Person";

//通过给定的类名称,加载对应的字节码文件,并封装成字节码文件对象Class.
Class clazz = Class.forName(className);

//拿到字节码文件对象之后,就可以对其进行操作了。
//创建实例:通过newInstance()就可以创建字节码对象所表示的类的实例。
Object obj = clazz.newInstance();

System.out.println(obj);

}
}


通过getConstructor函数获得指定的构造函数并初始化对象

1.获取字节码文件对象。

2.再获取给定的构造函数。

3.通过构造函数初始化对象。

package cn.itcast.reflect.demo;

import java.lang.reflect.Constructor;

public class Reflect_GetConstructor {

public static void main(String[] args) throws Exception {

getConstructorDemo();

}

public static void getConstructorDemo() throws Exception {

String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);

//获取指定的构造器。获取Person类中两个参数string,int的构造函数。
Constructor cons = clazz.getConstructor(String.class,int.class);

//有了构造器对象后,通过构造器对象来初始化给类对象。
Object obj = cons.newInstance("wangwu",23);

System.out.println(obj);

}

}


获取字节码文件对象中的成员

getXXX:获取都是类中公共的成员。

getDeclaredXXX:获取本类中已有的成员。

package cn.itcast.reflect.demo;

import java.lang.reflect.Field;

public class Reflect_GetField {

public static void main(String[] args) throws Exception {

getFieldDemo();

}

public static void getFieldDemo() throws Exception {

String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);

String fieldName = "age";

//获取age字段对象。
//		Field field = clazz.getField(fieldName);//获取是公共的字段。
Field field = clazz.getDeclaredField(fieldName);

//对其进行值的设置,必须先有对象。
Object obj = clazz.newInstance();

//通过查找父类AccessiableObject的方法。setAccessiable(true);
field.setAccessible(true);//取消权限检查,暴力访问。一般不访问私有。
field.set(obj, 30);

System.out.println(field.get(obj));
}

}


getMethod方法获取字节码文件对象的方法

package cn.itcast.reflect.demo;

import java.lang.reflect.Method;

public class Reflect_GetMethod {

public static void main(String[] args) throws Exception {

getMethodDemo2();

}

public static void getMethodDemo2() throws Exception {

String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);
String methodName = "staticShow";

Method method = clazz.getMethod(methodName, null);//null的位置应该传的是参数,但是这里没有参数。
method.invoke(null, null);//前一个null应该传对象,后一个null应该传参数。因为是静态无参函数,所以两者都是null。
}

public static void getMethodDemo() throws Exception {

String className = "cn.itcast.domain.Person";
Class clazz = Class.forName(className);

String methodName = "show";

Method method = clazz.getMethod(methodName, String.class,int.class);
Object obj = clazz.newInstance();
method.invoke(obj, "wangcai",20);
}
}


正则表达式

概述

对字符串进行复杂的操作的时候,可以使用正则表达式。

其好处是:用一些符号来代替代码,书写起来很方便。且,正则表达式在很多语言中规则是差不多通用的。
其弊端是:因为是一些符号组成的表达式,所以阅读起来可读性不高,读者需要先把符号学会才行。

将给定的正则表达式作为参数传到字符串类型对象的matches方法中,可以实现对该字符串对象的检验。

正则表达式的一些规则:

首先说一下,API文档中也是有正则表达式的符号说明的。

判断字符串内容的时候,用中括号来判断。
[1-9]:用来校验字符串的某一位字符是1-9的某一位数字。
[abc]:用来校验字符串的某一位字符是abc其中的某一位。
[^abc]:用来校验字符串的某一位字符除了abc都行。
.:表示该处字符可以使任意字符。

判断符合要求的字符出现的次数的时候,用大括号来判断。
[0-9]{4,14}:用来验证满足0-9要求的字符出现的次数是4-14次。
[0-9]{4,}:用来验证满足0-9要求的字符出现的次数大于等于4次。

[0-9]+:用来验证满足0-9要求的字符出现的次数是1次或多次。

[0-9]*:用来验证满足0-9要求的字符出现的次数是0次或多次。

[0-9]?:用来验证满足0-9要求的字符出现的次数是0次或1次。

[0-9]{4}:用来验证满足0-9要求的字符出现的次数恰好4次。

图形界面

//1,创建一个窗体。Frame

Frame f = new Frame("my frame");

//2, 对窗体进行基本设置。

f.setSize(500, 400);

f.setLocation(400, 200);

//设置布局。

f.setLayout(new FlowLayout());

//给窗体添加组件。

Button but = new Button("my button");

//加入一个文本框组件。

TextField tf = new TextField(40);

//将组件添加到窗体中。

f.add(tf);

f.add(but);

需求:想要点击按钮有效果,比如打印一句话。

思路:

1,确定事件源。按钮。

2,确定监听器。按钮添加监听器,按钮对象最清楚。到按钮对象中查找。

3,定义处理方式。

定义的规范:XXXLinstener:XXX监听器。 --对应的XXXEvent事件。

1,在按钮上添加所需的监听器。

but.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

System.out.println("按钮被触发了....."+e);

System.exit(0);

}

});

需求:想要实现点击窗体X就可以实现窗体的关闭。

思路:

1,事件源:窗体。

2,监听器。通过窗口对象去查。

3,事件处理。

到底哪些监听接口有适配器类?

只要监听接口的中的方法在2个以内,都没有适配器类。适配器的出现只为方便创建监听器对象。

但是一般监听接口都有适配器。

f.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.out.println("window closing");

System.exit(0);

}

public void windowOpened(WindowEvent e) {

System.out.println("window open");

}

});

演示鼠标监听。

按钮事件源。

鼠标监听器注册到按钮上。

组件.addXXXListener(new XXXAdapter()

{

public void methodName(XXXEvent e){}

}));
具体如下:

but.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

/*

* 想要对鼠标双击进行处理。应该找鼠标事件对象。因为事件对象一产生,内部必然封装事件源以及事件相关内容。

* 要查MouseEvent对象。

*/

if(e.getClickCount() == 2){

System.out.println("mouse double click");

}

}

});

需求:文本框中只能输入数字。

事件源:文本框。

文本框注册键盘监听。

事件处理
如下:
tf.addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent e) {

//执行代码

}

});

------- android培训java培训.net培训IOS培训 期待与您交流!
-------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: