`
泽博客
  • 浏览: 12013 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

黑马程序员_反射枚举与正则表达式总结总结

阅读更多
------- android培训java培训、期待与您交流! ----------


反射
1.Class类
.class文件加载到内存中就是一个Class对象
获取Class对象的方式有3种:
Scanner sc = new Scanner("xxx.txt");
Class.forName(sc.nextLine());
类名.class
对象.getClass()
类名.isprimitive是否是基本类型的类
类名.isArray是否是数组类型的类
2.Constructor类
Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了
可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数
然后再调用Constructor类的newInstance("张三",20)方法创建对象
3.Field
Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取
通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限
用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值
4.Method
Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法
调用invoke(Object, Object...)可以调用该方法
Class.getMethod("eat") invoke(obj) Class.getMethod("eat",int.class) invoke(obj,10)



构造方法的反射应用
·Constructor类代表某个类中的一个构造方法。
Constructor对象代表一个构造方法,Constructor对象上会有的方法有:得到方法名字,得到所属于的类,产生实例对象。

·得到某个类所有的构造方法:
例子:Constructor[] constructors= Class.forName("java.lang.String").getConstructors();
·得到某一个构造方法:
例子:Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//获得方法时要用到类型
注意:
一个类有多个构造方法,用什么方式可以区分清楚想得到其中的哪个方法呢?根据参数的个数和类型,例如,Class.getMethod(name,Class... args)中的args参数就代表所要获取的那个方法的各个参数的类型的列表。重点:参数类型用什么方式表示?用Class实例对象。

·创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc")); //调用获得的方法时要用到上面相同类型的实例对象
·Class.newInstance()方法:
例子:String obj = (String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。





成员方法的反射
·Method类代表某个类中的一个成员方法。

·得到类中的某一个方法:
例子:Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str, 1));

注意:
如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法!

·jdk1.4和jdk1.5的invoke方法的区别:
Jdk1.5:public Object invoke(Object obj,Object... args)
Jdk1.4:public Object invoke(Object obj,Object[] args)
即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数。所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke("str", new Object[]{1})形式。



框架与框架要解决的核心问题
我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。

·框架要解决的核心问题
我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢?
因为在写才程序时无法知道要被调用的类名,所以,在程序中无法直接new 某个类的实例对象了,而要用反射方式来做。



正则表达式
1.什么是正则表达式regex
是一种字符串的约束格式, 例如在某些网站上填写邮箱的时候, 如果乱写会提示输入不合法, 这种验证就是使用正则表达式做的.
2.匹配
String.matches() 验证一个字符串是否匹配指定的正则表达式
3.分割
String.split() 用指定正则表达式能匹配的字符作为分隔符, 分割字符串
4.替换
String.replaceAll() 把字符串中能匹配正则表达式的部分替换为另一个字符串
5.查找
Pattern.compile() 创建正则表达式对象
Pattern.matcher() 用正则表达式匹配一个字符串, 得到匹配器
Matcher.find() 查找字符串中是否包含能匹配正则表达式的部分
Matcher.group() 获取匹配的部分



package zhengzeyufanshe;

public class ZhengZe {
public static void main(String[] args) {
TODO Auto-generated method stub

字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)

预定义字符类
. 任何字符
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]


Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次

String  x = "[abcd]
System.out.println("da".matches(x));
String regex = "[^abc]";
System.out.println("a".matches(regex));
String y = "\\s";
System.out.println("\r".matches(y));
String regex1 = "[abc]{3,5}";
System.out.println("ccccac".matches(regex1));
这里有几道练习题大家可以想一想:
1,qq号码
2,1-6位字母或数字:
3,手机号
4,用户名. 字母数字下划线10位以内, 必须是字母开头
5,密码. 任意字符, 6-16位

String qq = "[1-9]\\d{4,10}";
String shuzi = "[0-9a-zA-Z]{1,6}";
String shuzi1= "[\\w^_]{1,6}";
String shouji = "1[34578]\\d{9}";
String yonghu = "[a-zA-Z]\\w{0-9}";
String mama = ".{6-16}";
.代表任意字符需要转义
String str = "开开开玩玩笑那把";
String regex2 = "(.)\\1+";
System.out.println(str.replaceAll(regex2,"$1"));

6,分组,例如快快乐乐,乐呵乐呵
7,Email
8,手机号码,后边五位必须是相同的
9,替换,将 开开开玩玩玩笑呢吧  替换成  开玩笑呢吧
10,将一条短信里面的电话号码都提出来

String regex001 = "(.)\\1(.)\\2";
System.out.println("快乐乐".matches(regex001));

String regex002 = "[\\w-\\.]+@([\\w-]+\\.){1,2}[a-z]{2,3}";
          
System.out.println("634157146@qq.com".matches(regex002));//本人qq邮箱哈
String shouji001 = "1[34578]\\d{4}(\\d)\\1{4}";


}

}


 



枚举总结一。枚举的作用介绍枚举,可以对只有几种取值可能的东西,进行限定,加入你取值不是限定中的其中之一,那么编译器就会报错,这样大大提高了程序的安全性,健壮性!二。枚举的实现原理枚举的原理,就好像是单例模式,把构造方法私有化,不要让别人创建对象,而由自己对外提供几个自己这个类的静态常量对象,这样,在赋值的时候,只能选我提供的这几个静态常量对象,而不能自己new对象!所以每个枚举元素都是一个对象!
2.自定义的枚举可以有抽象方法,该抽象方法必须由枚举的元素对象去实现,只要在枚举元素后面加个括号,括号后面在加个大括号,里面写个抽象方法的实现,就代表该元素对象是枚举类的子类!!
3.定义枚举用enum关键字,类似class关键字,枚举是一个特殊的类,枚举的取值范围,元素列表,必须定义在第一行,最前面,多个元素用逗号分隔,最后个元素用分号结束!!枚举的构造方法必须私有化!枚举可以有带参数的构造方法,调用该构造方法,只要在元素后面加个()括号传个相应的参数就可!
4.new Data(30){}。代表创建一个Data的子类,并调用父类有参数的构造方法!枚举当之有一个元素成员时,那就是一个单例!

------- android培训java培训、期待与您交流! ----------
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics