java基础 --反射,泛型,正则表达式

反射

  • 概念:
    反射是一种机制,利用该机制可以在程序运行过程中对该类进行解剖并操作类中的所有成员(成员变量, 成员方法, 构造函数)

反射操作类成员的前提:获取该类字节码文件对象Class对象

三种获取方式
方式1: 通过类名.class获得
方式2: 通过对象名.getClass()获得
方式3: 通过Class类的静态方法获得: Class.forName(“类全名”);
每一个类的Class对像只有一个;

方法说明
class常用方法
String getSimpleName()获取类名
String getName()获取类全名
T newInstance()创建Class对象关联类的对象
Constructor
Constructor getConstructor(Class… parameterTypes)根据参数类型获得对应的public修饰的Constructor对象。
Constructor[] getConstructors()获取所有public修饰的构造方法对象 ,返回数组
Constructor getDeclaredConstructor(Class… parameterTypes)根据参数类型获取任意修饰符对应的Constructor对象
Constructor[] getDeclaredConstructors()获得类中的所有构造方法对象,任意修饰符修饰的 ,返回数组
Constructor常用方法
T newInstance(Object … initargs)根据指定的参数创建对象
void setAccessible(boolean bo)设置是否取消权限检查,true为暴力反射,false表示不取消
Method
Method getMethod(String name,Class…args)获取用public修饰的对应的方法名和参数类型的构造方法对象
Method[] getMethod()获取用所有public修饰的对应的方法名和参数类型的构造方法对象, 返回一个数组
Method getDeclaredMethod(String name,Class…args)获取任意修饰符修饰的对应的方法名和参数类型的构造方法对象
Method[] getDeclaredMethod()获取任意修饰符修饰的对应的方法名和参数类型的构造方法对象,返回一个数组
Method常用方法
Object invoke(Object obj, Object… args)obj:调用指定对象obj的该方法, arge:调用方法时传递的参数
void setAccessible(boolean be)暴力破解
Field
Field getField(String name)根据成员变量名获取public修饰的Field对象
Field[] getFields()根据成员变量名获取public修饰的Field对象,返回一个数组
Field getDeclaredField(String name)根据成员变量名获取任意修饰符修饰的Field对象
Field[] getDeclaredField()根据成员变量名获取任意修饰符修饰的Field对象, 返回一个数组
Field常用方法
setXxx方法都是给对象obj的属性设置使用,针对不同的类型选取不同的方法。
void set(Object obj, Object value)
void setInt(Object obj, int i)
void setLong(Object obj, long l)
void setBoolean(Object obj, boolean z)
void setDouble(Object obj, double d)
getXxx方法是获取对象obj对应的属性值的,针对不同的类型选取不同的方法。
Object get(Object obj)
int getInt(Object obj)
long getLong(Object obj)
boolean getBoolean(Object ob)
double getDouble(Object obj)
void setAccessible(boolean bo)暴力破解
Class getType()获取属性的类型,返回Class对象

泛型

JDK1.5之后新增的语法,使用于未知类型的定义,可以作用在类,方法,接口中。

好处:

  • 将运行时期的ClassCastException,转移到了编译时期变成了编译失败
  • 避免了类型强转的麻烦

定义格式:
修饰符 class 类名<代表泛型的变量>{}

class ArrayList<E>{
       public boolean add(E e){}
       
       public E get(int index){}
}

泛型只需要在创建对象的时候确定类型,如:

class NewArrayList{
     public void demoList(){
          ArrayList<String> arr = new ArrayList<>();
      }
}
//这回ArrayList会如下
class ArrayList<String>{
      public boolean add(String e){}
      public String get(int index){} 

}

泛型方法定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }

public class GenMethod{
     public <T> void show (T t){
         System.out.println(t.getClass());
     }
     public <T> T show2 (T t){
     return t;
     }
}

泛型接口:
修饰符 interface 接口名<泛型变量名> {
}

public interface GenInterface<E>{
	public abstract void add(E e);
	
	public abstract E getE();  
}

接口定义的泛型可以在实现类或者实现类对象中确定

泛型通配符:<?>
不知使用什么类型接受的情况下可以使用泛型通配符?来表示未知通配。

void main(String[]args){
    Collection<Intger> list1 = new ArrayList<Integer>();
    getElement(list1);
    Collection<String> list2 = new ArrayList<String>();
    getElement(list2);
}

void getElement(Collection<?> coll){}
//?表示任意类型

泛型上限:
格式:类型名称<? extends 类> 对象名称
只能接收该类型及其子类

泛型下限:
格式:类型名称<? super 类> 对象名称
只能接收该类型及其父类型

public static void main(String[] args) {
    Collection<Integer> list1 = new ArrayList<Integer>();
    Collection<Number> list2 = new ArrayList<Number>();
    Collection<Object> list3 = new ArrayList<Object>();
    
    getElement(list1);
    getElement(list2);
    getElement(list3);//报错
  
    getElement2(list1);//报错
    getElement2(list2);
    getElement2(list3);
  
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}


正则表达式

样式含义
^表示正则起始
$表示正则结束

字符类

样式含义
[abc]表示a,b,c中其中一位字符
[^abc]表示除a,b,c以为,可以是任意字符
[a-z]表示取小写a到小写z中的一位
[A-Z]表示取大写A到大写Z中的一位
[0-9]表示取0到9任意一位数字
[a-zA-Z0-9]表示取在a-z,A-Z,0-9中的一位字符

预定义字符

样式含义
“.”匹配任意一位字符
“\\d”任意一位数字,与[0-9]相等
“\\D”取一位非数字,与[^0-9]相等
“\\s”空白字符
“\\S”非空白字符
“\\w”任意单词数字字符,与[a-zA-Z0-9]相等
“\\W”非单词字符

数量

样式含义用例(以\\d为例子)
X?0次或1次“\\d?”
X*0次到多次“\\d*”
X+1次或多次“\\d+”
X{n}指定n位“\\d{3}”:指定位3位数字
X{n,}至少n位起“\\d{3,}”:至少3位起,包含3位数字
X{n,m}范围值,从n(包含n)位起至m(包含m)位数字“\\d{3,6}”
    public static void main(String[] args) {
        String reg = "^1[1356789]\\d{9}$";
        //验证电话号码
        String s = "13333333333";
        System.out.println(s.matches(reg));
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值