当前位置:  编程技术>java/j2ee
本页文章导读:
    ▪Java高新技术-反射      java的反射技术,其具体用途就是框架,不过作为初学者,对于框架是什么还很模糊,所以对于反射的理解有不够深入。似乎很多编程模式都有用到反射的技术,不过对于什么是编程模式,我.........
    ▪Java String类      String类  官方文档中String类的基本说明:  public final class String  extends Object  implements Serializable, Comparable<String>, CharSequence  Java程序中的所有字面值(string literals),即双引号.........
    ▪java中的正则操作总结      正则表达式在处理字符串的效率上是相当高的关于正则表达式的使用,更多的是自己的经验,有兴趣可以参阅相关书籍这里主要写一下java中的正则操作方法 实例1:匹配import java.util.Scanner;.........

[1]Java高新技术-反射
    来源:    发布时间: 2013-10-14

java的反射技术,其具体用途就是框架,不过作为初学者,对于框架是什么还很模糊,所以对于反射的理解有不够深入。似乎很多编程模式都有用到反射的技术,不过对于什么是编程模式,我也只有一个很模糊的认识,买了一本java编程模式,发现根本看不懂。同样吐槽一下《人月神话》,表示没到一定的阶段,这种书完全是天书。

好了,下面开始总结一下自己所学的:

一、反射的基础是类,也就是Class.class,里面有很多方法,有些方法可以获得内存中的字节码文件。而从这个字节码文件又可以获得对应类的构造方法、成员变量、成员方法、内部类。

先说一下拿到字节码文件的3种方法:

String obja = "abc";
Class clazz1 = obja.getClass();
Class clazz2 = Class.forName("java.lang.String");
Class clazz3 = String.class;

以上3个Class对象指向的是同一份字节码文件,所以三者是相等的。
拿到了Class对象,就可以调用一些方法获得其构造方法、成员变量、成员方法、内部类。

构造方法:

Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor<?>[] getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor<?>[] getConstructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

成员变量

Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

成员方法

Method getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

虽然看起来方法很多,可是只要记住以下几点即可:
Method表示方法,Field表示成员变量,Constructor表示构造方法;后面加s表示一次获取多个。
因为类中的成员如果public修饰符,外部不能直接访问,所以有Declared的方法是可以获取到public和非public的成员的。如果没有Declared则表明获取public的。
因为java中允许有多个同名的方法(普通方法和构造方法),只要其传入参数的类型(包括)不同即可,所以在获取单个方法的时候,不光要指定方法的名称,还要指定参数的类型。

以下方法估计用的较少,就不额为写内容了。
内部类:(成员内部类)

Class<?>[] getDeclaredClasses()
返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口。
Class<?> getDeclaringClass()
如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。
Class<?>[] getClasses()
返回一个包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口。

注解

<A extends Annotation> A getAnnotation(Class<A> annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
Annotation[] getAnnotations()
返回此元素上存在的所有注释。
Annotation[] getDeclaredAnnotations()
返回直接存在于此元素上的所有注释。

判定

boolean isAnnotation()
如果此 Class 对象表示一个注释类型则返回 true。
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
boolean isAnonymousClass()
当且仅当底层类是匿名类时返回 true。
boolean isArray()
判定此 Class 对象是否表示一个数组类。
boolean isAssignableFrom(Class<?> cls)
判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口。
boolean isEnum()
当且仅当该类声明为源代码中的枚举时返回 true。
boolean isInstance(Object obj)
判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
boolean isInterface()
判定指定的 Class 对象是否表示一个接口类型。
boolean isLocalClass()
当且仅当底层类是本地类时返回 true。
boolean isMemberClass()
当且仅当底层类是成员类时返回 true。
boolean isPrimitive()
判定指定的 Class 对象是否表示一个基本类型。
boolean isSynthetic()
如果此类是复合类,则返回 true,否则 false。

一些复杂的方法

Constructor<?> getEnclosingConstructor()
如果该 Class 对象表示构造方法中的一个本地或匿名类,则返回 Constructor 对象,它表示底层类的立即封闭构造方法。
Method getEnclosingMethod()
如果此 Class 对象表示某一方法中的一个本地或匿名类,则返回 Method 对象,它表示底层类的立即封闭方法。
<U> Class<? extends U> asSubclass(Class<U> clazz)
强制转换该 Class 对象,以表示指定的 class 对象所表示的类的一个子类。
T cast(Object obj)
将一个对象强制转换成此 Class 对象所表示的类或接口。
boolean desiredAssertionStatus()
如果要在调用此方法时将要初始化该类,则返回将分配给该类的断言状态。
String getCanonicalName()
返回 Java Language Specification 中所定义的底层类的规范化名称。
Class<?> getComponentType()
返回表示数组组件类型的 Class。
Class<?> getEnclosingClass()
返回底层类的立即封闭类。
T[] getEnumConstants()
如果此 Class 对象不表示枚举类型,则返回枚举类的元素或 null。
Type[] getGenericInterfaces()
返回表示某些接口的 Type,这些接口由此对象所表示的类或接口直接实现。
Type getGenericSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。
Class<?>[] getInterfaces()
确定此对象所表示的类或接口实现的接口。
ProtectionDomain getProtectionDomain()
返回该类的 ProtectionDomain。
URL getResource(String name)
查找带有给定名称的资源。
InputStream getResourceAsStream(String name)
查找具有给定名称的资源。
Object[] getSigners()
获取此类的标记。
Class<? super T> getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
TypeVariable<Class<T>>[] getTypeParameters()
按声明顺序返回 TypeVariable 对象的一个数组,这些对象表示用此 GenericDeclaration 对象所表示的常规声明来声明的类型变量。

几个比较简

    
[2]Java String类
    来源:    发布时间: 2013-10-14
String类

  官方文档中String类的基本说明:

  public final class String

  extends Object

  implements Serializable, Comparable<String>, CharSequence

  Java程序中的所有字面值(string literals),即双引号括起的字符串,如"abc",都是作为String类的实例实现的。

  String是常量,其对象一旦创建就不能再被改变。换句话说,String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创造了一个全新的String对象,以包含修改后的字符串内容。

  String对象具有只读特性,指向它的任何引用都不可能改变它的值,因此,也不会对其他的引用有什么影响。

 

字符串连接

  为String对象重载的“+”操作符可以用来连接String。

  编译器看到String对象后面跟着一个“+”时,就将与之相加的其他对象(可能并不是字符串)也转换为字符串,转换时是通过调用该对象的toString()方法。

  当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。

  与之形成对比的是StringBuffer类,StringBuffer类使用append()方法追加字符串,向原有对象追加而不是创建新的对象。

  append()方法返回当前StringBuffer对象,因此可以串联起来使用。

  如:

StringBuffer buffer = new StringBuffer();

buffer.append("Hello").append(" World");

 

  StringBuffer类的toString()方法返回String类对象。

  StringBuffer类和String类的主要区别就是StringBuffer类的对象可以改变,而String类的对象一旦创建,就不能改变内容。

  Java SE5中引入了StringBuilder,StringBuilder和StringBuffer的主要区别是后者是线程安全的。

 

String类的equals()方法

  String类的equals()方法,覆写了Object类的equals()方法,判断当前字符串与传进来的字符串的内容是否一致。

  所以字符串相等的判断是用equals()方法,而不是使用==。

  String中的equals()方法源代码如下:  

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}

 

  这是个很好的例子,以后为自己的类覆写equals()方法的时候可以借鉴这个思路。

  并且注意,分析一个类的equals()方法时,要看这个类是否覆写了Object类的方法,如果没有覆写,那么该类的equals()方法仍然和Object类中的方法实现一样,即和==实现一样的功能。

 

String Pool

  String Pool,字符串池。

 

采用字面值赋值方式创建对象

  String str1 = "aaa";

  String str2 = "aaa";

  当以字符串直接创建String类的对象时,会在字符串池中查找是否已经存在该常量。

  如上例中,会在String Pool中查找是否存在"aaa"这个对象,如果不存在,则在String Pool中创建一个"aaa"对象,然后将其地址返回,赋给变量str1,这样str1会指向String Pool中的这个"aaa"对象。

  如果在String Pool中查找时已经存在该对象,则不创建任何对象,直接将String Pool中的这个对象地址返回,如上面str2直接得到"aaa"对象的地址,它和str1实际上指向同一个对象。

 

采用new的形式创建对象

  采用new的形式创建对象:

  String str = new String("aaa");

  new关键字必然会创建一个对象。

  这种形式创建字符串对象时仍然会在String Pool中查找。

  如果没有,则首先在String Pool中创建相应的对象,然后再在堆中创建一个对象;

  若相同对象已经存在,则在堆中创建对象。

  无论哪种情况,最后返回的地址都是堆中的地址。

  如上例,首先在String Pool中查找有没有"aaa"这个字符串对象,如果有,则不在String Pool中再去创建"aaa"这个对象了,直接在堆(heap)中创建一个"aaa"字符串对象,然后将堆中的这个"aaa"对象的地址返回来,赋给str引用。

  如果没有,则首先在String Pool中创建一个"aaa"对象,然后再在堆中创建一个"aaa"对象,然后将堆中的这个"aaa"对象的地址返回来,赋给str引用。

 

intern()方法

  调用如"Hello". intern()方法,如果字符串池中已经存在字符串"Hello"(通过equals()方法判断相同),则返回这个对象的引用;如果不存在,则把当前调用intern()方法的对象加入字符串池中,然后返回这个对象的引用

    
[3]java中的正则操作总结
    来源:    发布时间: 2013-10-14

正则表达式在处理字符串的效率上是相当高的

关于正则表达式的使用,更多的是自己的经验,有兴趣可以参阅相关书籍

这里主要写一下java中的正则操作方法

 

实例1:匹配

import java.util.Scanner;

class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//获取输入
System.out.print("Please Enter:");
String str = sc.nextLine();
check(str);
}

private static void check(String str) {
//匹配第一位是1-9,第二位及以后0-9(个数在4-10之间)
String regex = "[1-9][0-9]{4,10}";

/*
//匹配单个字符是大小写的a-z
String regex = "[a-zA-Z]";
//匹配数字,注意转义字符
String regex = "\\d";
//匹配非数字
String regex = "\\D";
*/

if(str.matches(regex)) {
System.out.println("匹配成功");
} else {
System.out.println("匹配失败");
}
}
}

此处String类中的matches()方法用于匹配

 

实例2:切割

import java.util.Scanner;

class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Please Enter:");
String str = sc.nextLine();
split(str);
}

private static void split(String str) {
//匹配一个或多个空格
String regex = " +";

String[] arr = str.split(regex);

for (String s : arr) {
System.out.println(s);
}
}
}

此处String类中的split()方法用于按正则表达式切割,返回一个String数组

 

实例3:替换

import java.util.Scanner;

class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Please Enter:");
String str = sc.nextLine();
replace(str);
}

private static void replace(String str) {
//匹配叠词
String regex = "(.)\\1+";
String s = str.replaceAll(regex, "*");
System.out.println(s);
}
}

注意replaceAll有两个参数,一个是正则,一个是替换的字符

本文链接


    
最新技术文章:
▪Java中使用开源库JSoup解析HTML文件实例
▪Java函数式编程(一):你好,Lambda表达式
▪Java函数式编程(二):集合的使用
▪Java函数式编程(三):列表的转化
▪Java函数式编程(四):在集合中查找元素
▪Java函数式编程(五):闭包
▪Java函数式编程(六):Optional
▪Java函数式编程(七):MapReduce
▪Java函数式编程(八):字符串及方法引用
▪Java函数式编程(九):Comparator
▪Java函数式编程(十):收集器
▪Java函数式编程(十一):遍历目录
▪Java函数式编程(十二):监控文件修改
▪Java编程中的一些常见问题汇总
▪java之super关键字用法实例解析
▪java生成jar包的方法
▪java之static关键字用法实例解析
▪java方法重写实例分析
▪java之this关键字用法实例分析
▪Java中避免空指针异常的方法
▪Java Web使用简单的批处理操作(记事本+Tomcat)
▪java对象转型实例分析
▪java之Object类用法实例
▪java继承中的构造方法实例解析
▪Java String字符串和Unicode字符相互转换代码
▪Java注解之Retention、Documented、Inherited介绍
▪Java中对AtomicInteger和int值在多线程下递增操作...
▪Java设计模式之装饰者模式详解和代码实例
▪Java8新特性之字符串去重介绍
▪Java网络编程基础教程之Socket入门实例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3